获取并行运行的子 shell 的退出代码

获取并行运行的子 shell 的退出代码

我尝试编写一个 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
}

相关内容