我有以下简单命令,可以使用 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 一样。
根据问题:
是不是
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
错误信息则会存储在后台的某个地方。