我最终通过一个 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 处理邮件报告。
答案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
您应该指导stderr
andd 而不是 bothstdout
和stderr
。
使用1> /dev/null
not2>&1
应该没问题。另外,您可能需要在备份脚本中正确报告错误。