使用 crontab 在脚本中调用 nohup

使用 crontab 在脚本中调用 nohup

我正在尝试使用 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不会产生任何有用的影响。

查看您的本地电子邮件(mailmailx)并阅读其中报告的错误消息cron- 或者less /var/mail/$USER如果您想要快捷方式。或者改变你的crontab线路以捕获标准输出标准错误到您稍后可以查看的文件

*/30 * * * * /home/user/scripts/keep_alive.sh >ka.log 2>&1

通常,脚本不会在以下环境下运行,cron因为您忘记设置环境($PATH等)。

相关内容