通常当 cron 作业崩溃时,它会在日志中留下一些错误消息。
我们使用 cron 作业运行 shell 脚本和一些 java 程序。最近我们从日志中发现了一些奇怪的事情。显然程序要么崩溃,要么被杀死,因为有一个我们在程序初始化时设置的程序锁,没有被释放。我们猜测该程序已被终止,因为该程序的日志没有显示完成消息。
谁可能会终止该作业?当 cron 作业终止时,我如何通过电子邮件收到通知?
编辑:我不希望使用 crontab 方式接收电子邮件,因为它只是将每个标准输出推送到电子邮件。就我而言,不同程序有很多其他系统输出,因为其中一些没有使用 log4j 或者它们是由 shell 脚本回显的。由于系统中有很多用户,我们不能要求所有用户都管理他们程序的标准输出。
答案1
检查您的系统日志。要检查哪些日志取决于您的安装;在使用默认设置的 Debian 上,您将得到:
- 在 中
/var/log/auth.log
,通知 cron 作业何时开始和完成,因为该作业涉及 PAM 会话; - 中
/var/log/syslog
,注意到grandchild #32283 failed with exit status 1
. /var/log/kern.log
如果您的进程被 OOM 杀手终止,则附加通知。
如果您的 cron 作业在其标准输出或标准错误上产生任何输出,您将收到来自 cron 的电子邮件(除非您的本地邮件传送系统未正确设置)。如果邮件悄悄返回非零状态(包括被信号杀死的情况),您将不会收到邮件。如果你想要一个通知,请安排一个外壳包装器,在出现错误时会产生噪音,例如
42 1 * * * /path/to/real/job || echo $?
如果您想记录有关进程及其死亡方式(以及它们如何诞生,但在这里您已经知道)的更多信息,请参阅是否有过去线程的日志,但现在已关闭?
答案2
要调试这个你可以把
set -e -u
位于 shell 脚本的顶部 - 当命令失败或使用未定义的变量时,它会以错误退出状态结束。
然后您可以从 cron-job 调用一个包装脚本,该脚本调用主脚本,如下所示
sh -x main_script.sh || echo Failed with exit status: $?
每一-x
行在执行之前都会被打印出来。输出由 cron 守护进程邮寄给您。
当输出太大时,您还可以使用临时文件:
sh -x main_script.sh > $TEMPFILE 2>&1
if [ $? -ne 0 ]; then echo Failed with exit status $? - see $TEMPFILE; fi
如果退出状态是> 128
命令被信号中断 - 例如有人“杀死”它、发生分段错误或存在内存不足的情况(如何从退出状态获取信号)。