如果我正确理解您的问题,您希望将错误(不是输出)发送到日志文件,并通过电子邮件发送它们。
为此,请结合使用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)
| 归档时间: |
|
| 查看次数: |
6577 次 |
| 最近记录: |