我的家庭服务器上有一个简单的脚本,用于将数据同步到我的备份驱动器进行存储。
现在它一个接一个地运行多个 rsync。
有时 rsync 会在其中一个或两个节点上失败。当这种情况发生时,我希望它给我发邮件说它失败了,我已经让它给我发了一封报告,但是,我想有一种方法来知道它是否失败了。
如果 Rsync 退出时代码非 0,则表示失败。因此,我需要一段简单的代码来检查 rsync 状态,如果状态不是 0,则允许我执行操作。
有人能告诉我如何实现这一点吗?谢谢。
答案1
基本上,您要使用变量$?
。此变量包含上次运行命令的返回状态。
% /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>)
答案2
对于在脚本中使用,我更喜欢这种通用构造:
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
答案3
对上述答案的一个建议/优化:
如果这是至关重要的,我会让脚本确认 OK 而不是失败,例如使用
wget "http://yourpage.com/callhome.php?device_id=xxx"
并让网络服务器处理检查如果没有呼叫回家。(首先使用 wget 调用进入数据库,然后 cron 检查是否有该机器的条目)并以任何/多种方式做出反应(邮件、短信/文本,...)
因为邮件无法送达目标的原因有很多。我同意,这需要做很多工作……