【问题标题】:Killing Subshell with SIGTERM使用 SIGTERM 杀死 Subshel​​l
【发布时间】:2014-10-01 02:39:39
【问题描述】:

我确信这真的很简单,但无论如何它都在咬我的脸,我有点沮丧和难过。

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

#!/bin/sh
sleep 50 | echo

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

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

然后,如果我给它发送sigterm,那么它也会死掉,但是如果我在ps里看,sleep还在运行。

我在这里错过了什么?

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

帮助我的人。我很笨。

【问题讨论】:

  • Bash 的机制可能会以某种方式阻止未由键盘发送的 SIGINT 信号被处理。

标签: shell kill sigterm


【解决方案1】:

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

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

编辑:我不认为你是愚蠢的。流程和工作原理看似简单,但细节往往很复杂,甚至专家也会被这种事情搞糊涂。

【讨论】:

  • 更具体地说,Ctrl-C 将SIGINT 发送到当前进程group,这意味着信号会传播到所有进程(shell 和两端的两个进程)管道)在组中。
【解决方案2】:

我做了同样的事情,我编写了名为 test.sh 的脚本,下面包含了。

#!/bin/sh
sleep 50 | echo

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 2013-08-05
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多