获取已知进程ID的退出代码

问题描述

我有一系列并行触发的进程列表。而且,我需要在完成所有这些进程时知道所有这些进程的退出代码无需等待以完成所有进程。

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