向子进程传播信号

时间:2018-12-09 14:23:40

标签: c bash

我有一些从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进程发送信号?

2 个答案:

答案 0 :(得分:1)

我建议您考虑按父pid搜索子进程。更具体地说,在杀死pid之前,请使用ps搜索该pid的子进程,然后首先杀死那些子进程。最后,杀死父母。

我觉得有些情况下会导致比赛失败。

答案 1 :(得分:0)

更新:我的问题与该脚本完全无关; pid的运行/重新启动进程从未改变,但是我无意中继承了我在程序内部各种线程中阻塞的信号。明智地致电pthread_sigmask解决了这个问题。

不过,感谢@Mark提供有关子进程的提示;如果正在进行fork个呼叫,那将是一个非常好的方法!