Rsync 退出代码检查器 - Bash

Rsync 退出代码检查器 - Bash

我的家庭服务器上有一个简单的脚本,用于将数据同步到我的备份驱动器进行存储。

现在它一个接一个地运行多个 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 检查是否有该机器的条目)并以任何/多种方式做出反应(邮件、短信/文本,...)

因为邮件无法送达目标的原因有很多。我同意,这需要做很多工作……

相关内容