使用 nohup 和 rsync 的简单备份 bash 脚本

使用 nohup 和 rsync 的简单备份 bash 脚本

我有以下简单命令,可以使用 nohup 在后台启动备份过程:

nohup rsync -a /src /target &

我正在尝试寻找一个合适的解决方案来捕获退出代码并将失败或成功消息发送到日志文件或邮件中。为了实现这一点,我尝试了以下方法:

nohup rsync -a /src/ /target/ &
oldpid=$!
wait $oldpid

if [[ $? -eq 0 ]]
then
        echo "SUCCESS"
else
        echo "FAILED"
fi

代码似乎运行良好,但实际上我不知道这是否是一种可靠的方法。我有两个担心:

  • $?当中间执行另一个命令时,该变量会被覆盖吗?
  • 是不是wait $oldpid跟nohup的异步方式搞混了?

或者这种逻辑可能很愚蠢,有更好的方法吗?

答案1

根据问题:

$?当中间执行另一个命令时,该变量会被覆盖吗?

答案是是的。该变量$?包含最后一个任务的退出状态。例如:

$ false; echo $?
1
$ false; true; echo $?
0
$ false; true; false; echo $?
1

就像变量$!包含最后一个后台任务的 PID 一样。

参考:Devhints.io:Bash 脚本速查表


根据问题:

是不是wait $oldpid搞乱了异步方式nohup

它不应该——它不是专为此类任务而设计的吗?:)


根据问题:

或者这种逻辑可能很愚蠢,有更好的方法吗?

对我来说,不清楚为什么你推rsync背景然后wait只需执行命令,然后进行测试。

#!/bin/bash
rsync -a source.file destination.file 2>/dev/null

if [[ $? -eq 0 ]]; then echo "SUCCESS"; else echo "FAILED"; fi
  • 2>/dev/null在这里用于抑制的错误信息rsync,但您可以将它们保存在临时文件中并将其附加到电子邮件中。

但可能这不是整个剧本......


此外,第一行help wait还提供了以下信息。

等待:等待 [-fn] [id ...]

等待作业完成并返回退出状态。

wait因此,您可以直接在语句中使用输出if。我已经对这种方法进行了成功的测试。

#!/bin/bash
nohup rsync -a source.file destination.file 2>/dev/null &
oldpid=$!

if wait $oldpid
then
        echo "SUCCESS"
else
        echo "FAILED"
fi
  • 2>/dev/null在这里用于抑制 的错误信息nohup,而rsync错误信息则会存储在后台的某个地方。

相关内容