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分支启动进程。这种判断逻辑比原脚本的字符串匹配更可靠,还避免了输出干扰。
三、最终修正步骤
- 替换
/etc/crontab里的错误配置为正确的su执行命令; - 使用修正后的改进版脚本替换原脚本。
内容的提问来源于stack exchange,提问作者PutsandCalls
相关产品推荐
相关产品推荐

