问题描述
我有一系列并行触发的进程列表。而且,我需要在完成所有这些进程时知道所有这些进程的退出代码,无需等待以完成所有进程。
status=$?; echo $status
将为最后执行的命令提供退出代码,但是我如何知道任何已完成的进程的退出代码,知道进程ID?
解决方法
您可以使用 GNU Parallel 来做到这一点,
parallel --halt=now,done=1 ::: ./job1 ./job2 ./job3
--halt=now,done=1
意味着完成任何一项作业后立即停止,立即杀死所有未完成的作业,并以完整作业的退出状态退出。
有一些选项可以在成功,失败或完成时退出。成功,失败或完成的作业数量也可以按百分比给出。请参阅文档here。
,使用包装程序外壳程序功能保存后台作业ID。之后,可以查询每个作业的退出状态:
#!/bin/bash
jobs=()
function run_child() {
"$@" &
jobs+=($!)
}
run_child sleep 1
run_child sleep 2
run_child false
for job in ${jobs[@]}; do
wait $job
echo Exit Code $?
done
输出:
Exit Code 0
Exit Code 0
Exit Code 1