Cronjob stderr 到文件和电子邮件

Cronjob stderr 到文件和电子邮件

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

我发现但没有帮助我。

最简单的方法是什么?

答案1

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

为此,请结合使用teestdout/stderr 重定向。

根据cron(8)manpage,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

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

* * * * * ls tmp/foo tmp/bar 2>&1 >/dev/null | tee -a $HOME/var/log/test.log

结果如下。电子邮件和 ~/var/log/test.log 都显示相同的内容。

电子邮件正文如下:

ls: tmp/bar: No such file or directory

日志文件说了同样的事情:

$ cat ~/var/log/test.log
ls: tmp/bar: No such file or directory

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

{ { ./configure && make && make install ; } >> $LOGFILE ; } 2>&1 | tee -a $LOGFILE

答案2

使用tee

MBPro-ABustardo:~ abustardo$ echo foo |tee tmp  
foo

MBPro-ABustardo:~ abustardo$ cat tmp  
foo

在你的情况下:

[your script] 2>&1 |tee [some local local file] |mail -s [subject] [email protected]

答案3

这回答了你的问题了吗?https://stackoverflow.com/questions/1396506/cron-send-email-with-stderr-but-not-stdout

Cron 应该在每次运行后发送一封电子邮件,除非指示/dev/null

相关内容