我有一些从Shell脚本开始的进程集合,如下所示:
#!/bin/bash
#This is a shortcut to start multiple storage services
function finish {
alljobs=$(jobs -p)
if [ ! -z "$alljobs" ]; then
kill $alljobs >/dev/null 2>&1
else
echo "Entire trio ceased running"
fi
}
trap finish EXIT
./storage &
P1=$!
./storage &
P2=$!
./storage &
P3=$!
wait $P1 $P2 $P3
当前,它执行我想要的方式,因为当我向它发送ctrl+c
信号时,脚本将该信号发送给我所有的后台进程。
但是,我现在扩展了这些程序,以便基于它们从客户端收到的连接/消息,它们可以执行execv
,杀死自己并启动一个新的独立程序。 (出于好奇,他们通过启动一个空闲进程来模拟“服务器死机”状态,然后该空闲进程可能会接收信号以再次启动原始进程。)
问题在于,execv
之后,这个新进程不再响应bash脚本发送的kill
。
是否有一种方法可以允许该原始脚本的执行(以及随后的信号发送)也向新的exec
进程发送信号?
答案 0 :(得分:1)
我建议您考虑按父pid搜索子进程。更具体地说,在杀死pid之前,请使用ps搜索该pid的子进程,然后首先杀死那些子进程。最后,杀死父母。
我觉得有些情况下会导致比赛失败。
答案 1 :(得分:0)
更新:我的问题与该脚本完全无关; pid
的运行/重新启动进程从未改变,但是我无意中继承了我在程序内部各种线程中阻塞的信号。明智地致电pthread_sigmask
解决了这个问题。
不过,感谢@Mark提供有关子进程的提示;如果正在进行fork
个呼叫,那将是一个非常好的方法!