当脚本抛出错误时,如何让 cron 发送带有错误日志的电子邮件?

lin*_*ser 5 linux cron pipe io-redirection mailx

我有一个运行脚本的 cron 作业,该脚本在 sql 数据库中编写错误检查并将错误写入日志文件。日志文件在运行脚本的命令中提供。我只想在脚本发现错误时收到一封电子邮件,我希望将日志包含在电子邮件中。如果脚本没有发现任何错误,我不想收到电子邮件。显然,当脚本发现或没有发现错误时,脚本会写入日志(我没有写这个脚本)。

    20 6-10 * * 1-5 ~/job_failure_test.sh -o ~/job_fail.log 2>&1 /dev/null | mail -s "Errors" myemail@something.com < ~/job_fail.log
Run Code Online (Sandbox Code Playgroud)

到目前为止,当有错误写入日志时,这一行会向我发送电子邮件,但它不会向我发送更新的日志。它向我发送了上次执行 cron 作业的日志。

use*_*275 10

只是改变| (管道)到 || (an or )(假设脚本正确使用退出代码),尽管将脚本更改为仅在出错时输出,这样做是更好的做法:

MAILFROM=myemail@something.com
MAILTO=myemail@something.com
20 6-10 * * 1-5 ~/job_failure_test.sh
Run Code Online (Sandbox Code Playgroud)

丑陋的方式;

20 6-10 * * 1-5 ~/job_failure_test.sh > ~/job_fail.log 2>&1 || mail -s "Errors" myemail@something.com < ~/job_fail.log
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 7

此功能内置于 cron 中!如果该命令产生任何输出,或者返回非零状态,则 cron 会向您发送一封电子邮件。

许多现代发行版不设置本地电子邮件。如果没有,请安装邮件传输代理 (MTA)。看到例如这个线程的 Ubuntu,或在本地发送邮件的最小 MTA(对于 cron)?如果你绝对想要简约的东西。或者只是安装一个通用的 MTA,例如 Exim 或 Postfix,然后将其配置为仅用于 Debian 的本地交付(例如参见此线程)。设置本地电子邮件后,您可以使用您最喜欢的邮件客户端阅读本地电子邮件。

您可以创建一个~/.forward包含外部电子邮件地址的文件,而不是在本地阅读您的电子邮件,并且您的所有本地电子邮件都将转发到那里。如果您选择转发,您必须有一个能够从外部发送邮件的 MTA(“智能主机”)。

或者,MAIL在 crontab 中设置变量,使其直接将电子邮件发送到该地址。这也要求您的系统可以向外部发送电子邮件。