我遇到的情况是,守护进程重新启动后,前几次命令执行尝试返回 2(后跟 stderr 消息),然后一切正常。
为了绕过这个错误,我想到应该利用while/do/done/until
some 的功能sleep
,但有趣的部分是我应该拥有通过常规执行方式获得的所有数据:
...
RESULT=$(command param1 param2 2>&1)
SIG=$?
...
那么有没有一种方法可以command param1 param2
重复执行,直到退出状态不是 2(任何给定值),并且在变量中具有 STDOUT+STDERRRESULT
并在变量中具有退出状态SIG
,如所介绍的那样?
答案1
outfile=$(mktemp)
while ! command param1 param2 >"$outfile" 2>&1; do
[ "$?" -ne 2 ] && break
sleep 10
done
result=$(<"$outfile")
rm "$outfile"
这将一遍又一遍地运行该命令(每次之间有 10 秒的延迟),直到它成功或至少不返回 a2
作为退出状态。
该命令的输出被写入一个临时文件,在循环之后,该文件被读入一个变量并被删除。读取变量位需要bash
,就像我在这里编写的那样。
答案2
until [ "$SIG" != "2" ]; do
command param1 param2
SIG=$?
done
这将每次运行该命令,直到返回一个不同于 2 的数字。