Cronjob stderr 到文件和电子邮件

Bas*_*974 7 linux logging cron

我需要我的 cronjobs 仍然继续在某些文件中输出错误,但我也希望同时通过电子邮件发送它们。如果没有一些技巧,这似乎是不可能的。

我找到了这个,但没有帮助我。

最简单的方法是什么?

Ste*_*ski 8

如果我正确理解您的问题,您希望将错误(不是输出)发送到日志文件,并通过电子邮件发送它们。

为此,请结合使用tee和 stdout/stderr 重定向。

根据cron(8)联机帮助页,cron 可以为您处理电子邮件。无需不必要地重复这项工作。

执行命令时,任何输出都会通过邮件发送给 crontab 的所有者(或发送给在 crontab 中的 MAILTO 环境变量中命名的用户,如果存在的话)。

这里的技巧是将 STDERR 发送到日志文件和电子邮件,而不是 STDOUT。以下示例说明了如何执行此操作。

假设我的脚本执行以下命令。ls tmp/foo成功,因此此输出转到 STDOUT。ls tmp/bar产生一个错误,所以这个输出被发送到 STDERR。

$ ls tmp/foo tmp/bar
ls: tmp/bar: No such file or directory
tmp/foo
Run Code Online (Sandbox Code Playgroud)

以下 cronjob 将隐藏任何 STDOUT,但会将 STDERR 重定向到 /var/log/test.log

* * * * * ls tmp/foo tmp/bar 2>&1 >/dev/null | tee -a $HOME/var/log/test.log
Run Code Online (Sandbox Code Playgroud)

这是结果。电子邮件和 ~/var/log/test.log 都会说同样的话。

电子邮件正文说:

ls: tmp/bar: No such file or directory
Run Code Online (Sandbox Code Playgroud)

日志文件说同样的话:

$ cat ~/var/log/test.log
ls: tmp/bar: No such file or directory
Run Code Online (Sandbox Code Playgroud)

作为额外的好处,还可以将 STDERR 和 STDOUT 发送到日志文件(您只是偶尔查看),但将 STDERR 发送到屏幕(如果手动运行)或电子邮件(如果从 cron 运行)。我将以下代码段用于长时间运行的构建脚本。

{ { ./configure && make && make install ; } >> $LOGFILE ; } 2>&1 | tee -a $LOGFILE
Run Code Online (Sandbox Code Playgroud)