Answers:
理想情况下,如果一切都按预期进行,您希望备份脚本不输出任何内容,而仅在出现问题时才产生输出。然后使用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
/bin/backup.sh > log_file || (echo Backup failed with exit status $?; cat log_file)
?
使用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
始终发送电子邮件,即使成功/bin/backup.sh
(顺便说一句,应该在/usr/local/bin
)也是如此。只需省略该| mail -s "Backup status" email@example.com
部分,只有在有输出时才会发送电子邮件。您可能(取决于cron
)可以在crontab文件中显式设置要发送给mail的电子邮件地址。
有关详细信息,请参见
man 5 crontab
这是我多年以来成功使用的另一种变体-捕获输出并仅在出错时输出它,触发电子邮件。这不需要临时文件,并保留所有输出。重要的部分是2>&1
将STDERR重定向到STDOUT的部分。
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,您仍然会收到电子邮件。