Cron:仅在电子邮件中收到错误?

Cron:仅在电子邮件中收到错误?

我最终通过一个 shell 脚本为我的数据设置了一个切实可行的备份计划,这些计划由 cron 在很短的时间间隔内处理。不幸的是,每次执行 CRON 时,我都会收到空邮件,而不仅仅是在出现问题时。

是否可以仅在出现问题时(即我的命令TAR未按预期执行)才让 CRON 发送电子邮件?

以下是我目前的 crontab 设置方式;

0 */2 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" [email protected]

多谢!

答案1

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

[email protected]
0 */2 * * * /bin/backup.sh

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

[email protected]
0 */2 * * * /bin/backup.sh > /dev/null

答案2

使用慢性的包装脚本看起来是个好主意;使用它你不必改变你的脚本。

代替:

 0 1 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" [email protected]

做:

 [email protected]
 0 1 * * * cronic /bin/backup.sh

简而言之;如果一切顺利(退出状态 0),它将静默运行,但如果不顺利,它将会详细报告,并让 cron 处理邮件报告。

更多信息https://habilis.net/cronic/

答案3

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

通过默认的 cron 邮件程序配置发送整个输出:

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

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

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

1 2 * * * OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT" | mail -s "Failed to backup" [email protected]

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

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

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

答案4

您应该指导stderrandd 而不是 bothstdoutstderr

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

相关内容