我正在尝试使用 crontab 来检查并重新运行长时间运行的脚本。我创建了一个脚本来检查状态并在需要时运行长时间运行的脚本。
我正在使用 nohup 运行长时间运行的脚本,以使其在注销时保持运行。
保持活动脚本:
#!/bin/bash
BASE_PATH=~/scripts
LOG_PATH=${BASE_PATH}/keep_alive.log
write_to_log () {
date >> ${LOG_PATH}
echo ${1} >> ${LOG_PATH}
echo "--------------" >> ${LOG_PATH}
}
pid=$(pgrep long_script)
if [ -z "${pid}" ]; then
write_to_log "long_script is no runnig, starting..."
nohup ${BASE_PATH}/long_script.py &
fi
crontab 条目:
*/30 * * * * /home/user/scripts/keep_alive.sh
当我手动运行脚本(在 bash 中,./keep-alive.sh)时,一切正常并且长脚本启动。
从 crontab 中,脚本立即启动并退出(路径/表达式没有问题),我看到写入了日志,但长脚本停止了。所以我的结论是 nohup 在 crontab 中的工作方式与在 bash 中不同。
我厌倦了使用 setsid 或 disown,但得到了相同的结果。
我该如何解决?谢谢。
答案1
nohup
使用时不需要crontab
。除非您systemd
配置为在注销时终止所有进程,否则 shell 退出和crontab
运行进程(或其他)之间没有交互,并且nohup
不会产生任何有用的影响。
查看您的本地电子邮件(mail
或mailx
)并阅读其中报告的错误消息cron
- 或者less /var/mail/$USER
如果您想要快捷方式。或者改变你的crontab
线路以捕获标准输出和标准错误到您稍后可以查看的文件
*/30 * * * * /home/user/scripts/keep_alive.sh >ka.log 2>&1
通常,脚本不会在以下环境下运行,cron
因为您忘记设置环境($PATH
等)。