我如何知道 cron 作业何时被杀死或崩溃?

lam*_*988 8 cron

通常当一个 cron 作业崩溃时,它会在日志中留下一些错误信息。

我们使用 cron 作业运行 shell 脚本和一些 java 程序。最近我们从日志中发现了一些奇怪的东西。显然,程序要么崩溃要么被杀死,因为我们在程序初始化时设置了一个程序锁,但没有释放。我们猜测程序被杀死是因为程序的日志没有显示完成消息。

谁可能会终止这项工作,当 Cron 工作终止时,我如何通过电子邮件获得通知?

编辑:我不希望 crontab 方式接收电子邮件,因为它只是将每个标准输出推送到电子邮件。在我的例子中,有很多来自不同程序的其他系统输出,因为其中一些没有使用 log4j 或者它们被 shell 脚本回显。因为系统中有很多用户,我们不能要求所有用户都管理他们程序的标准输出。

max*_*zig 6

要调试这个,你可以把

set -e -u
Run Code Online (Sandbox Code Playgroud)

在 shell 脚本的顶部 - 当命令失败或使用未定义的变量时,它会以错误退出状态结束。

然后你可以从 cron-job 调用一个包装脚本,它像这样调用主脚本

sh -x main_script.sh || echo Failed with exit status: $?
Run Code Online (Sandbox Code Playgroud)

-x每行被打印出来之前被执行。输出由 cron 守护程序邮寄给您。

当输出太大时,您还可以使用临时文件:

sh -x main_script.sh > $TEMPFILE 2>&1
if [ $? -ne 0 ]; then echo Failed with exit status $? - see $TEMPFILE; fi
Run Code Online (Sandbox Code Playgroud)

如果退出状态是> 128命令被信号中断 - 例如有人“杀死”了它,发生了分段错误或内存不足情况(如何从退出状态获取信号)。


Gil*_*il' 6

检查您的系统日志。检查哪些日志取决于您的安装;在具有默认设置的 Debian 上,您将获得:

  • 在 中/var/log/auth.log,从 cron 作业开始和完成的时间开始通知,因为该作业涉及 PAM 会话;
  • /var/log/syslog,一个通知grandchild #32283 failed with exit status 1
  • /var/log/kern.log如果您的进程被 OOM 杀手终止,则附加通知。

如果您的 cron 作业在其标准输出或标准错误上产生任何输出,您将收到来自 cron 的电子邮件(除非您的本地邮件传递系统设置不正确)。如果它悄悄返回非零状态(包括被信号杀死的情况),您将不会收到邮件。如果你想要一个通知,安排一个 shell 包装器,以防出错,例如

42 1 * * * /path/to/real/job || echo $?
Run Code Online (Sandbox Code Playgroud)

如果您想记录有关进程以及它们如何消亡(以及它们如何诞生,但在这里您已经知道)的更多信息,请参阅是否有过去线程的日志现在已关闭?