【问题标题】:Bash Script not killed after it kills the PGID of its own and all its child processesBash 脚本在杀死自己的 PGID 及其所有子进程后没有被杀死
【发布时间】:2019-06-13 20:54:17
【问题描述】:

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

有一个实用程序会调用这个 sample_script.sh,当我通过这个实用程序中断脚本的执行时,脚本会收到 SIGNAL 13 (SIGPIPE)。

在接收到信号时,hive 进程被终止,因为它与 sample_script.sh 位于相同的进程组 ID。但是脚本会随着 sleep 命令继续运行。

testuser 36223     1  0 13:13 ? 
     <sleep also runs> as child of 36223

我还注意到,有时 hive 进程也没有被杀死,但行为是随机的。

  1. 为什么 kill -9 -PGID 不会杀死脚本本身。 -- 总是发生
  2. 任何猜测为什么有时子进程也没有被杀死 -- 随机

【问题讨论】:

    标签: linux bash shell signals kill


    【解决方案1】:

    问题1:问题是当script_sample.sh通过另一个脚本启动时,它的pgid是它的父进程的pid,而不是它自己的pid。

    这个修改后的脚本应该可以按照你的意愿工作,通过明确地向ps 询问 pgid,需要注意的是陷阱现在也应该杀死父脚本以及它调用的任何其他内容,因此请谨慎使用!

    #!/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; 添加到您的陷阱中,在启动hive 后设置它,但我的子进程(在我的实验中睡觉)通常仍然存在。就好像它进入了一个无法杀死的马厩,我不知道这对kill -9来说是可能的。请注意,如果我 ^C 父母,我的孩子睡眠存活,但如果我 kill -13 script_sample.sh 进程,那么我的孩子睡眠进程死亡。我不明白为什么。

    其他部分解决方案

    我一直在寻找更安全的解决方案,打算在自己的 pgid 组中运行 script_sample.sh 并且不让陷阱杀死父脚本,但我还没有运气。

    我想过使用setsid,它应该可以让我在新会话中启动进程,但它并没有像我想要的那样改变 pgid。

    我想在script_sample.sh 的顶部使用set -m,这使得它运行的每个命令都以新的pgid 开始(然后陷阱必须kill -9 -$PIDkill -9 $$)。陷阱现在行为正确,但整个事情以新的创造性方式行为不端,使得杀死父级变得更加困难 - 不知何故,这似乎导致父级在被杀死时不再发出script_sample.sh 信号,并导致父级忽略^C.

    尽管提供了所有这些部分信息,但我发布此答案是因为我至少回答了问题 1,希望对您有所帮助。

    【讨论】:

    • 谢谢乔尼斯。但是正如你所说:问题是当 script_sample.sh 通过另一个脚本启动时,它的 pgid 是它的父进程的 pid 而不是它自己的 pid。但我不确定是不是这样......``` sshd,25853,25846 -sh,25854,25854 /home/sample_script.sh -java,25860,25854 -Xmx16384m -XX:+UseConcMarkSweepGC -XX:+CM |-{java},27035,25854 ```
    • 如果您想确定,请在设置该变量后添加echo mypgid=$mypgid pid=$$。如果没有您的 ps 命令,我不知道您是在向我显示 ppid、会话 ID 还是 pgid。
    • @Sparrow 我知道这并没有完全解决你的问题,所以我不建议接受这个答案,但如果它有帮助,你会考虑投票吗?
    猜你喜欢
    • 2016-01-24
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2014-08-09
    相关资源
    最近更新 更多