Cron:只收到电子邮件中的错误?


38

最后,我通过外壳程序脚本在数据上设置了切合实际的备份计划,该计划由cron严格间隔处理。不幸的是,每次执行CRON时(不仅是出现问题时),我总是收到空的电子邮件。

仅当出现问题时,才可以让CRON发送电子邮件。我TAR没有按预期执行?

现在,这是我的crontab设置的方式;

0 */2 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" email@example.com

非常感谢!

Answers:


53

理想情况下,如果一切都按预期进行,您希望备份脚本不输出任何内容,而仅在出现问题时才产生输出。然后使用MAILTO环境变量将脚本生成的所有输出发送到您的电子邮件地址。

MAILTO=email@example.com
0 */2 * * * /bin/backup.sh

如果您的脚本正常产生输出,但您不在cron中关心它,只需将其发送到/ dev / null即可,只有在将某些内容写入stderr时,它才会通过电子邮件发送给您。

MAILTO=email@example.com
0 */2 * * * /bin/backup.sh > /dev/null

9
这几乎不是理想的。通常,当命令以非零错误代码结尾时,通常会将整个输出(stdout + stderr)通过电子邮件发送给您。否则,通常可以吞噬至少stdout。对我来说,这是cron的设计缺陷。
Witiko

3
@Witiko我同意;我发现此问题试图解决此问题。我想您可以执行cron命令/bin/backup.sh > log_file || (echo Backup failed with exit status $?; cat log_file)
Daniel H

22

使用cronic包装器脚本看起来是个好主意;要使用它,您无需更改脚本。

代替:

 0 1 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" email@example.com

做:

 MAILTO=email@example.com
 0 1 * * * cronic /bin/backup.sh

简单的说; 如果一切运行顺利(退出状态为0),它将安静运行;如果不运行,它将详细报告,并由cron处理邮件报告。

有关更多信息,请访问https://habilis.net/cronic/


当问题只不过是错误的cron行而cron完全按照命令执行时,我真的看不到有什么帮助。
John Gardeniers '02

3
@JohnGardeniers这很有帮助,因为有时您的输出没有错误。
2014年

11
另外,也可以chronicmoreutils软件包中获取:joeyh.name/code/moreutils
Vladimir Panteleev 2015年

4

您明确指示cron始终发送电子邮件,即使成功/bin/backup.sh(顺便说一句,应该在/usr/local/bin)也是如此。只需省略该| mail -s "Backup status" email@example.com部分,只有在有输出时才会发送电子邮件。您可能(取决于cron)可以在crontab文件中显式设置要发送给mail的电子邮件地址。

有关详细信息,请参见

man 5 crontab

3

您应该指挥stderranmd而不是stdoutstderr

1> /dev/null不要使用2>&1,应该没问题。另外,您可能需要在备份脚本中正确报告错误。


3

这是我多年以来成功使用的另一种变体-捕获输出并仅在出错时输出它,触发电子邮件。这不需要临时文件,并保留所有输出。重要的部分是2>&1将STDERR重定向到STDOUT的部分。

通过默认的cron mailer配置发送整个输出:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT"

相同,但具有特定的地址和主题:

(也可以通过为整个crontab文件设置MAILTO = xxxx来更改地址)

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT" | mail -s "Failed to backup" an@email.address

您甚至可以针对错误执行多项操作并添加到电子邮件中:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || {echo "$OUTPUT" ; ls -ltr /backup/dir ; }

这将适用于简单的命令。如果要处理复杂的管道(find / -type f | grep -v bla | tar something-or-other),则最好将命令移至脚本中并使用上述方法运行脚本。原因是,如果管道的任何部分输出到STDERR,您仍然会收到电子邮件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.