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

时间:2017-09-13 09:07:12

标签: bash parallel-processing exit

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

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

不幸的是我没有bash 4.3,所以wait -n不是一个选项,也不是#3004811

中建议的gnu并行

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

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

1 个答案:

答案 0 :(得分:2)

答案在How to wait in bash for several subprocesses to finish and return exit code !=0 when any subprocess ends with code !=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

正确给出

starting
14772 0
14773 0
14774 1
14775 1
1
FAIL! (1)

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