我有一个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'
答案 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(并行块完成后退出)。