- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
脚本示例.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:问题是当通过另一个脚本启动 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 -$PID
和 kill -9 $$
)。陷阱现在行为正确,但整个事情以新的创造性方式行为不端,使得杀死父级变得更加困难 - 不知何故,这似乎导致父级在被杀死时不再发出 script_sample.sh
信号,并且它会导致父级忽略 ^C。
尽管有所有这些部分信息,我还是发布了这个答案,因为我至少已经回答了问题 1,我希望这对您有所帮助。
关于linux - Bash 脚本在杀死它自己及其所有子进程的 PGID 后没有被杀死,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56588441/
我有以下简单程序,它为 STDIN 设置主程序的 pgid 和 pgroup。然后,我有一个信号处理程序,它打印当前进程的 pgid 和发送信号的进程的 pgid。这是我的代码 pid_t pid;
如何在 ISML 级别创建没有 PGID 的链接? 下面的代码非常适合避免在 URL 中使用 session ID,但仍然在 URL 末尾添加 PGID。 #sessionlessurl(Action
在 BASH 中,如何从另一个具有不同 PGID 的 BASH 进程生成一个 BASH 进程? 到目前为止,我只知道使用 setsid(创建一个新的 session ID,以及作为结果的 PGID)来
脚本示例.sh #!/bin/bash for sig in 13 15 18; do trap "kill -9 -$$;" $sig done hive -f hivescript.hql
在我正在开发的 shell 中,我执行一组命令 A |乙 | C 通过派生子进程来执行管道中的每个子进程。这 3 个 child 都具有与第一个 child 相同的 PGID。也就是说,PID x、y
我被分配到 Write a C program that prints the following identifiers PID, PPID, SID, PGID, UID, EUID. 作业接着问
我是一名优秀的程序员,十分优秀!