我有一个从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
'd进程发送信号?
我建议您考虑按父pid搜索子进程。更具体地说,在杀死一个pid之前,使用ps搜索该pid的子进程,并首先杀死这些子进程。最后,杀死父母。
我有一种感觉,在某些情况下,比赛条件会导致比赛失败。
更新:我的问题与这个脚本完全无关;正在运行/重新启动的进程的pid
从未改变,但我无意中继承了我在程序内部各个线程中阻止的信号。对pthread_sigmask
的一些明智的呼吁解决了这个问题。
不过,感谢@Mark提供的有关子进程的提示;如果有fork
调用正在进行,那将是一个非常好的方法!