Linux Bash脚本在杀死自己及其所有子进程的PGID后未被杀死

Linux Bash脚本在杀死自己及其所有子进程的PGID后未被杀死,linux,bash,shell,signals,kill,Linux,Bash,Shell,Signals,Kill,script_sample.sh #!/bin/bash for sig in 13 15 18; do trap "kill -9 -$$;" $sig done hive -f hivescript.hql & PID=$! while [ `ps ${PID} | wc -l` -gt 1 ] do echo waiting sleep 5 done 有一个实用程序将调用这个示例_script.sh,当我通过这个实用程序中断脚本的执行时,脚本接收信号

script_sample.sh

#!/bin/bash
for sig in 13 15 18; do
    trap "kill -9 -$$;" $sig
done

hive -f hivescript.hql & 
PID=$!

while [ `ps ${PID} | wc -l` -gt 1 ]
do
    echo waiting
    sleep 5
done
有一个实用程序将调用这个示例_script.sh,当我通过这个实用程序中断脚本的执行时,脚本接收信号13(SIGPIPE)

接收到信号后,配置单元进程将被终止,因为它与sample_script.sh位于同一进程组id中。但是,脚本会随着sleep命令继续运行

testuser 36223     1  0 13:13 ? 
     <sleep also runs> as child of 36223
testuser 36223 1 0 13:13?
作为36223的孩子
我还注意到,有时蜂巢进程也没有被杀死,但行为是随机的

  • 为什么kill-9-PGID不能杀死脚本本身经常发生
  • 任何猜测为什么子进程有时也不会被杀死——随机的

  • 问题1:问题是当通过另一个脚本启动
    script\u sample.sh
    时,它的pgid是其父脚本的pid,而不是它自己的pid

    这个修改后的脚本应该可以按照您的意愿工作,通过显式地询问pgid的
    ps
    ,并警告陷阱现在也应该杀死父脚本,以及它调用的任何其他脚本,因此请小心使用

    #!/bin/bash
    mypgid=`ps -o pgid $$ | tail -1 | sed 's/ //g'`
    for sig in 13 15 18; do
        trap "kill -9 -$mypgid;" $sig
    done
    ...
    
    问题2:不确定,我的解决方案解决了问题1,但子进程通常仍然存在。我尝试添加
    kill-9$PID
    到您的陷阱,在启动
    蜂巢后设置它,但我的子进程(在我的实验中睡眠)通常仍然存在。这就好像它自己进入了一个不可动摇的稳定状态,我不知道在一个
    kill-9
    的情况下这是可能的。请注意,如果我是父母,我的孩子的睡眠会存活下来,但是如果我
    kill-13
    script\u sample.sh
    进程,那么我的孩子睡眠进程就会死亡。我不明白为什么

    其他部分解决方案

    我一直在寻找更安全的解决方案,目的是在自己的pgid组中运行
    script\u sample.sh
    ,而不是让陷阱杀死父脚本,但我还没有任何运气

    我曾想过使用
    setsid
    ,这应该可以让我在新会话中启动进程,但它不会以我想要的方式更改pgid

    我想在
    script\u sample.sh
    的顶部使用
    set-m
    ,这使得它运行的每个命令都以一个新的pgid开始(然后陷阱必须
    kill-9-$PID
    kill-9$$
    )。陷阱现在运行正常,但整个过程以新的创造性方式出现错误,使杀死父对象变得更加困难-不知何故,这似乎导致父对象在被杀死时不再发出信号
    script\u sample.sh
    ,并导致父对象忽略^C


    尽管有这些不完整的信息,我还是发布了这个答案,因为我至少回答了问题1,我希望这会有所帮助。

    谢谢Joanis。但正如您所说:问题在于,当通过另一个脚本启动script_sample.sh时,它的pgid是其父脚本的pid,而不是它自己的pid。但我不确定情况是否如此……````sshd,2585325846-sh,2585425854/home/sample_script.sh-java,2586025854-Xmx16384m-XX:+useConcmarkswipegc-XX:+CM |-{java},2703525854``如果您想确定,请在设置该变量之后添加
    echo mypgid=$mypgid pid=$$
    。没有你的<代码> PS < /C>命令,我不知道你是否给我看PPID、session ID或PGID。@斯派洛,我知道这并不能完全解决你的问题,所以我不建议接受答案,但是如果它有帮助,你会考虑投票吗?