ctrl + c没有杀死后台功能

时间:2018-04-13 15:10:38

标签: linux bash signals

我创建了这个脚本:

code fn()
{
  sleep 1001
}

fn &
sleep 1000
echo "finish"

当我扯过它并列出进程时(它的pid是11570):

$ ps xao pid,ppid,pgid,command | grep 11570 |grep -v grep

11570 24322 11570 /bin/bash ./bash.sh
11577 11570 11570 /bin/bash ./bash.sh
11578 11570 11570 sleep 1000
11579 11577 11570 sleep 1001

然后我用ctrl + c杀死它,同样的ps返回:

11577     1 11570 /bin/bash ./bash.sh
11579 11577 11570 sleep 1001

然后:

kill -INT 11579 

没什么好开心的(bg中仍然是相同的过程)

我知道 ctrl + c 与杀死它相同:

kill -INT -11570 

同样的情况(相同的两个进程仍在后台)。 然后 - 在下一次运行中 - 我一个接一个地杀死了组中的进程,发现唯一关心的是睡眠中没有功能的。

我当时认为主要流程完成了,这就是它完成的原因。但是应该打印'完成'。 (就像我打断这个睡眠时一样)

现在的问题是:

为什么只有一个睡眠应答中断信号?

如何在中断时使这个脚本清理进程?

1 个答案:

答案 0 :(得分:0)

不幸的是,它仅针对最后一个问题回答,但有人可以使用它。

要清理此捕获信号应该有效:

trap 'kill -TERM -$$' EXIT

在脚本的EXIT上,它正在向其组( - $$)发送TERMINATE信号。然后,将终止gpid与主进程pid相同的所有进程。

PS。 我仍然不知道为什么只有一个睡眠响应INT信号以及它为什么会发生。