在bash中使用trap捕获终止的后台进程的pid

在bash中使用trap捕获终止的后台进程的pid,bash,unix,signals,child-process,bash-trap,Bash,Unix,Signals,Child Process,Bash Trap,我正在编写一个bash脚本,它生成了许多后台进程。我希望在进程终止时收到通知;我想知道终止进程的pid 我已经研究了如何使用wait,以便捕获每个派生进程的PID并将其存储在一个数组中,然后迭代该数组,并在每个进程上调用wait。这里以各种方式描述了该技术: 如果我理解正确的话,问题在于,如果您希望在单个进程终止后立即执行某些操作,那么它的效率相对较低。例如,如果生成进程A和B,并且B在A之前完成,则执行必须等待A和B完成。B一结束我就要执行一个动作 似乎trap SIGCHLD是一种在孩子终

我正在编写一个bash脚本,它生成了许多后台进程。我希望在进程终止时收到通知;我想知道终止进程的pid

我已经研究了如何使用
wait
,以便捕获每个派生进程的PID并将其存储在一个数组中,然后迭代该数组,并在每个进程上调用wait。这里以各种方式描述了该技术:

如果我理解正确的话,问题在于,如果您希望在单个进程终止后立即执行某些操作,那么它的效率相对较低。例如,如果生成进程A和B,并且B在A之前完成,则执行必须等待A和B完成。B一结束我就要执行一个动作

似乎
trap SIGCHLD
是一种在孩子终止时立即执行操作的方法,但问题是我找不到一种方法来确定SIGCHLD信号源的pid,我也需要它。我发现的最接近这个工作示例的是本文中的第三个代码示例:

为了方便起见,我将其复制粘贴在这里:

#!/bin/bash

iNext=0

function ChildReturned() {
        wait $1
        echo "$1 was returned. Its exits status was: $?"
        iNext=$((iNext+1))
        StartChild $iNext
}


function StartChild {
        ./child $1 &
        pid=$!
        echo "Started: $1  PID= $pid"
        trap 'ChildReturned $pid' SIGCHLD
}


set -bm

for (( iNext=0; iNext<=10; iNext++ ));
do
        StartChild $iNext
done

wait
#/bin/bash
不精确=0
函数ChildReturned(){
等等,1美元
echo“$1已返回。其退出状态为:$?”
不确定性=$((不确定性+1))
StartChild$INXT
}
函数StartChild{
/儿童1美元&
pid=$!
echo“已启动:$1 PID=$PID”
陷阱“ChildReturned$pid”信号
}
set-bm

为了((InEXT=0;InExt*P>设置陷阱一次,在陷阱中,您可以调用<代码>作业-n>代码>查看您上次检查过哪些孩子已经完成。注意这并不能告诉您哪个孩子发送了SigCHLD;考虑两个孩子在进入陷阱之前死亡的情况。在这种情况下,您只会进入陷阱一次,这是一个模拟POI。nt您实际响应的是哪个孩子的信号。请注意,
-n
是一个bash扩展,您可能更喜欢使用
jobs-l
kill-0$PID
:非常有用!谢谢!更好的是,名为“我想并行处理一堆文件”,当一个文件完成后,我想开始下一个文件。我想确保一次运行5个作业。我读过的最好答案是,
parallel
命令当前可以在基于Debian的发行版上的moreutils包中找到。这与不同,但两者执行类似的功能。很酷,我不知道
jobs-n
。我认为这应该可以很好地解决我的问题嗯,所以我要把这个问题标记为已解决。