在bash中使用trap捕获终止的后台进程的pid
我正在编写一个bash脚本,它生成了许多后台进程。我希望在进程终止时收到通知;我想知道终止进程的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是一种在孩子终
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
。我认为这应该可以很好地解决我的问题嗯,所以我要把这个问题标记为已解决。