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

Man*_*o D 5 command-line bash backup scripts rsync

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

nohup rsync -a /src /target &
Run Code Online (Sandbox Code Playgroud)

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

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

if [[ $? -eq 0 ]]
then
        echo "SUCCESS"
else
        echo "FAILED"
fi
Run Code Online (Sandbox Code Playgroud)

该代码似乎工作正常,但如果这是一种可靠的方法,我现在实际上不工作。我有两个担忧:

  • $?当中间执行另一个命令时,该变量是否会被覆盖?
  • 难道是wait $oldpidnohup的异步方式搞乱了?

或者也许这个逻辑只是愚蠢的并且有更好的方法?

pa4*_*080 5

根据问题:

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

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

$ false; echo $?
1
Run Code Online (Sandbox Code Playgroud)
$ false; true; echo $?
0
Run Code Online (Sandbox Code Playgroud)
$ false; true; false; echo $?
1
Run Code Online (Sandbox Code Playgroud)

就像变量$!包含最后一个后台任务的 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
Run Code Online (Sandbox Code Playgroud)
  • 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
Run Code Online (Sandbox Code Playgroud)
  • 2>/dev/null此处用于抑制 的错误消息nohup,而rsync错误消息会在后台某处显示。