我有一组进程,我从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
,自杀并启动一个新的独立程序 . (好奇的是,他们通过启动空闲进程来模拟"server dead"状态,然后可以接收信号以再次启动原始进程 . )
问题是,在 execv
之后,这个新进程不再响应bash脚本发送的 kill
.
有没有办法允许这个原始脚本的执行(以及后续信令)也向新的 exec
'd过程发送信号?
2 回答
更新:我的问题与此脚本完全无关;运行/重启过程的
pid
从未改变过,但我无意中继承了我在程序内部各个线程中阻塞的信号 . 一些明智的呼吁pthread_sigmask
解决了这个问题 .感谢@Mark提供有关子进程的提示;如果有
fork
个电话正在进行,那将是一个非常好的方法!我建议你考虑通过父pid搜索子进程 . 更具体地说,在杀死pid之前,使用ps搜索该pid的子进程并首先杀死这些子进程 . 最后,杀死父母 .
我觉得在某些情况下会有竞争条件导致这种情况失败 .