我尝试编写一个 shell 脚本来启动一系列长时间运行的进程。我们将它们称为 a、b、c、d 和 e。进程 b、c 和 d 应并行运行,进程 e 必须在所有先前的进程终止后运行成功地。
这是我的(伪)代码:
{
echo "starting a"
a
}&&
{
(echo "starting b"; b; exit $?)&
(echo "starting c"; c; exit $?)&
(echo "starting d"; d; exit $?)&
wait
}&&
{
echo "starting e"
e
}
我的问题是,如果 b、c、d 中的任何一个失败,脚本将继续并执行 e。有没有办法防止这种情况发生?
非常感谢您的回答!
安托万
答案1
{
(echo "starting b"; b)&
(echo "starting c"; c)&
(echo "starting d"; d)&
wait %1 && wait %2 && wait %3
}&&
当等待特定作业时wait
返回此作业的退出代码
为了理解,请看这两个例子:
只有最后一行是重要的(显示退出状态wait
)
(sleep 3; false) & wait; echo $?
[1] 25358
[1]+ Exit 1 ( sleep 3; false )
0
--
(sleep 3; false) & wait %1; echo $?
[1] 25362
[1]+ Exit 1 ( sleep 3; false )
1
答案2
通过在后台运行一个进程,你基本上告诉 shell 你对它的成功或失败不感兴趣。
wait
将要如果适用,则报告任何信号在其退出代码中的值。这不是您想要的。
一种解决方案是让每个命令将其状态报告给标准输出并使用 grep 计算响应。
{
(echo "starting b"; b && echo ok)&
(echo "starting c"; c && echo ok)&
(echo "starting d"; d && echo ok)&
} |
grep -c ok | ( read n && (( n==3 )) ) &&
{
echo "starting e"; e
}