You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Crontab执行Shell脚本if语句失效问题及改进脚本咨询

问题分析与解决方案

一、原脚本与Crontab的错误点

1. Crontab命令格式错误

你在/etc/crontab里的命令段完全写错了:putsncalls23 -l /home/putsncalls23/run_script.sh 不是合法的执行逻辑。Crontab的字段顺序是分 时 日 月 周 用户 命令,这里要切换到putsncalls23用户执行脚本,正确写法应该用su命令:

*/5 *    * * *  root    su - putsncalls23 -c "/home/putsncalls23/run_script.sh"

原写法会让Crontab误以为putsncalls23是可执行命令,直接报错,根本没运行你的脚本。

2. 原if判断的潜在问题

原脚本里的if [ $(/bin/pgrep -f "miner_nbeats.py") ]; 存在两个坑:

  • Crontab环境下,pgrep的-f参数可能匹配到Crontab自身执行的脚本进程(因为脚本里包含了miner_nbeats.py字符串),导致误判进程正在运行;
  • 如果pgrep返回多个PID,[ ]会把空格分隔的PID当成多个参数,触发test命令的语法错误,导致判断失效。

二、改进版脚本的可用性与关键命令解释

1. 改进版脚本的可用性(先修正语法错误)

你提供的改进版脚本末尾有语法问题:python miner_nbeats.py$ 多了个$,且tmux new-session缺少-d参数(后台创建会话,否则Crontab无终端环境会执行失败),还漏了Enter参数。修正后完整可用的脚本如下:

PATH=/opt/conda/bin:/opt/conda/condabin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
if /bin/pgrep -f "miner_nbeats.py" >/dev/null; then
    echo "script running"
else
    echo "script not running"
    tmux new-session -d \; send-keys "source activate python310 && cd /home/putsncalls23/directory && python miner_nbeats.py" Enter
fi

2. /bin/pgrep -f "miner_nbeats.py" >/dev/null 的作用

  • /bin/pgrep -f "miner_nbeats.py":-f参数让pgrep匹配整个命令行(而非仅进程名),能精准定位运行miner_nbeats.py的Python进程;
  • >/dev/null:将pgrep输出的PID信息丢弃到空设备,因为if判断只需要命令的退出状态码:找到匹配进程时pgrep返回0(成功),执行echo "script running";没找到时返回非0,进入else分支启动进程。这种判断逻辑比原脚本的字符串匹配更可靠,还避免了输出干扰。

三、最终修正步骤

  1. 替换/etc/crontab里的错误配置为正确的su执行命令;
  2. 使用修正后的改进版脚本替换原脚本。

内容的提问来源于stack exchange,提问作者PutsandCalls

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 20:06:12