在bash中获得并行执行的结果

时间:2016-03-18 20:11:29

标签: bash shell sh

我有一个bash脚本,我在其中调用其他脚本并行运行。使用wait命令,我可以等到所有并行进程完成。但我想知道并行执行的所有进程是否成功执行(返回码为0)。

我的代码如下:

--calling multiple processes to execute in backgroud
process-1 &
process-2 &
process-3 &
wait
--after parallel execution finishes I want to know if all of them were successful and returned '0'

3 个答案:

答案 0 :(得分:1)

您可以使用wait -n返回下一个作业终止的退出代码。为每个后台流程调用一次。

process-1 &
process-2 &
process-3 &
wait -n && wait -n && wait -n

答案 1 :(得分:0)

wait -n似乎是正确的解决方案,但由于它不存在于bash 4.2.37中,你可以尝试这个技巧:

#!/bin/bash    
(
    process-1    ||  echo $! failed &
    process-2    ||  echo $! failed &
    process-2    ||  echo $! failed &
    wait
) | grep -q failed

if [ $? -eq 0 ]; then
    echo at least one process failed
else
    echo all processes finished successfully
fi

确保在获得实际成功的同时,进程本身不会返回字符串“failed”。你也可以使用stdin和stderr重定向来运行带有process-1 &>/dev/null的/ dev / null的进程

答案 2 :(得分:0)

我编写了一个简化解决方案的工具:https://github.com/wagoodman/bashful

您提供了一个描述您要运行的内容的文件......

# awesome.yaml

tasks:
  - name: My awesome tasks
    parallel-tasks:
      - cmd: ./some-script-1.sh
      - cmd: ./some-script-2.sh
      - cmd: ./some-script-3.sh
      - cmd: ./some-script-4.sh

...然后像这样运行:

bashful run awesome.yaml

然后它将与垂直进度条并行运行您的任务,显示每个任务的状态。故障以红色表示,如果发现任何错误,程序将退出1(并行块完成后退出)。