鉴于此hack.c程序:
#include <stdio.h> main() { int i=0; for(i=0; i<100; i++) { printf("%d\n",i); sleep(5); } }
和这个hack.sh bash脚本:
#!/bin/bash ./hack
如果我运行hack.sh,则会创建两个进程 – 一个用于bash,一个用于C任务.如果TERM信号被发送到bash进程,则C进程不受伤害.
现在,假设原始bash是使用Runtime.exec()从Java程序启动的,所以我对它的唯一控制是Process.destroy()(它将TERM发送到bash进程)?假设我希望C进程与启动它的bash一起死掉?
我一直在用bash尝试这样的事情:
#!/bin/bash trap "kill -TERM -$$; exit" TERM ./hack
即捕获TERM信号并将其重新广播到整个进程组的陷阱子句.这对我不起作用 – 其中包含该陷阱子句的bash进程忽略了TERM信号.
我在这里错过了什么?
您可以尝试以下这些方面:
#!/bin/bash ./hack & pid=$! trap "kill $pid" TERM wait $pid
这可能更简单(和等效):
#!/bin/bash ./hack & trap "kill $!" TERM wait
陷阱上的双引号应该在定义陷阱时进行单词扩展,因此更改值为$!不应该有影响;但我更喜欢第一个版本.