用SIGTERM杀死子shell

时间:2014-08-07 18:27:32

标签: shell kill sigterm

我确定这很简单,但无论如何它都让我咬了一口,我有点沮丧和难过。

所以,我有一个脚本,我已经设法归结为:

#!/bin/sh
sleep 50 | echo

如果我在命令行运行它,然后点击Ctrl-C就会停止,就像我期望的那样。

如果我发送sigint,使用kill,它什么都不做。 我觉得这很奇怪,因为我觉得那些应该是一样的。

然后,如果我发送它sigterm,那么它也会死掉,但如果我查看ps,睡眠仍在运行。

我在这里错过了什么?

这显然不是运行python的真实脚本,而且在start-stop-daemon试图杀死守护进程后它继续运行时会出现更多问题。

帮助我的人。我很蠢。

2 个答案:

答案 0 :(得分:1)

发生这种情况的原因是Ctrl-C被传递到睡眠过程,而您发送的sigint仅传递给脚本本身。有关详细信息,请参阅Child process receives parent's SIGINT

您可以在点击ctrl-c或发送sigint时使用strace -p自行验证; strace会告诉你传递了什么信号。

编辑:我不认为你是愚蠢的。流程及其工作原理看似简单,但细节往往很复杂,甚至专家也会对这类事情感到困惑。

答案 1 :(得分:0)

我做了同样的事情,我写了一个名为test.sh的脚本,其中包含以下内容。

#!/bin/sh
sleep 50 | echo

执行后,我做了Ctrl-C - &gt;工作正常意味着关闭它。 再次执行并在另一个终端中我在找到pid之后通过ps -ef|grep test.sh检查了PID,我做了kill <pid>并且它杀死了进程,再次验证我执行ps -ef|grep test.sh并且没有得到任何pid。