gpt4 book ai didi

linux - Bash 脚本在杀死它自己及其所有子进程的 PGID 后没有被杀死

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:32:02 25 4
gpt4 key购买 nike

脚本示例.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. 任何猜测为什么子进程有时也没有被杀死 -- 随机

最佳答案

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

这个修改后的脚本应该可以按照你想要的方式工作,通过显式地向 ps 询问 pgid,需要注意的是陷阱现在也应该杀死父脚本,以及它调用的任何其他东西,所以使用 with小心!

#!/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 之后设置它,但我的子进程(在我的实验中 sleep )通常仍然存在。就好像它自己进入了一个无法杀死的马厩,我不知道这对 kill -9 是可能的。请注意,如果我 ^C 父进程,我的 child sleep 会继续存在,但如果我 kill -13 script_sample.sh 进程,那么我的 child sleep 进程就会死亡。我不明白为什么。

其他部分解决方案

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

我想过使用 setsid,它应该让我在新 session 中启动进程,但它不会按照我想要的方式更改 pgid。

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

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

关于linux - Bash 脚本在杀死它自己及其所有子进程的 PGID 后没有被杀死,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56588441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com