如何在bash中获取多个并行后台进程的退出状态

Tob*_*biM 4 parallel-processing bash exit

在 Bash 中,我想并行多次调用一个命令,同时捕获所有进程的退出代码。

我知道如何启动并等待它们,但是等待只会给我最后一个进程退出的退出代码。我还需要生命周期较短的进程的退出代码。

不幸的是我没有 bash 4.3,所以wait -n不是一个选项,gnu 并行也不是#3004811中建议的

#16032001几乎问了同样的问题,但也没有提供解决方案。

我目前能想到的唯一方法是编写一个帮助程序脚本,将退出代码存储在文件中,但这听起来不像是一个干净的解决方案。

Tob*_*biM 6

答案是如何在 bash 中等待多个子进程完成并在任何子进程以代码 !=0 结束时返回退出代码 !=0?

我不知道虽然孩子立即被 bash 收获,但内置等待仍然可以访问 pid 的退出代码。

#!/bin/bash

FAIL=0
PIDS=""

echo "starting"

sleep 5 &
PIDS="$PIDS $!"

sleep 3 &
PIDS="$PIDS $!"

/bin/false &
PIDS="$PIDS $!"

sleep 3 &
PIDS="$PIDS $!"

for job in $PIDS
do
    wait $job || let "FAIL+=1"
    echo $job $FAIL
done

echo $FAIL

if [ "$FAIL" == "0" ];
then
    echo "YAY!"
else
    echo "FAIL! ($FAIL)"
fi
Run Code Online (Sandbox Code Playgroud)

正确给出

starting
14772 0
14773 0
14774 1
14775 1
1
FAIL! (1)
Run Code Online (Sandbox Code Playgroud)

只有第三个进程 (/bin/false) 失败,如第三行中从 0 到 1 的切换所示。

  • 当您想要存储项目列表时,请考虑使用数组,而不是字符串。这段代码很脆弱——一旦“IFS”更改为不同的值,“$PIDS”将不再评估您想要的列表。 (3认同)