我的家庭服务器上有一个简单的脚本来同步数据到我的备份驱动器进行存储。
现在它一个接一个地运行多个rsyncs。
有时rsync在其中的一个或两个失败。 当发生这种情况时,我希望它给我发电子邮件,说它失败了,我已经有电子邮件给我一个报告,但是,我想知道是否失败。
如果Rsync以非0代码退出,则表示失败。 所以我需要一些简单的代码来检查rsync状态,如果它不是0,允许我执行一个操作。
有没有人有任何提示,我会如何做到这一点? 谢谢。
基本上你想要使用variables$? 。 该variables包含上次运行命令的返回状态。
% /bin/false % echo $? 1 % /bin/true % echo $? 0
你可以使用这些结构来运行rsync ,如果成功则发送邮件(echo true),或者如果发送失败,则发送给你邮件(echo false)。
% /bin/false && echo true || echo false false % /bin/true && echo true || echo false true
像这样的东西:
% rsync \ && (echo "succeed" | mail -s "succeed" <email>) \ || (echo "failure" | mail -s "failure" <email>)
为了在脚本中使用,我更喜欢这种通用结构:
check_exit_code() { exit_code=$? if [ "$exit_code" -ne "0" ] ; then echo "$1" echo "exit with exitcode $exit_code" return 1 fi } myCommand check_exit_code "smth failed"
你可以在这个函数中使用sendmail添加或者在你的crontab中添加MAILTO
build议/优化,在awers之前:
如果这是至关重要的,我会让脚本确认一个OK,而不是失败,例如一个
wget "http://yourpage.com/callhome.php?device_id=xxx"
并让networking服务器检查是否没有回家。 (用wget调用第一个数据库条目,然后cron检查是否有该机器的条目),并以任何/多种方式作出反应(邮件,短信/文本,…)
因为邮件从未达到目标的原因有很多。 这是更多的工作,我同意…