TERM的bash陷阱 - 我做错了什么?

时间:2009-10-06 16:42:04

标签: bash signals term bash-trap

鉴于此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信号。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:10)

你可以尝试这些方法:

#!/bin/bash
./hack &
pid=$!
trap "kill $pid" TERM
wait $pid

执行此操作可能更简单(和等效):

#!/bin/bash
./hack &
trap "kill $!" TERM
wait

陷阱上的双引号应该在定义陷阱时进行单词扩展,因此更改值为$!不应该有影响;但我更喜欢第一个版本。