答案1
如果我正确理解了您的问题,您想将错误(而不是输出)发送到日志文件,并通过电子邮件发送。
为此,请结合使用tee
stdout/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