扭曲的程序和TERM信号

时间:2011-07-19 07:49:39

标签: python twisted

我有一个简单的例子:

    from twisted.internet import utils,reactor

    def test:
        utils.getProcessOutput(executable="/bin/sleep",args=["10000"])

    reactor.callWhenRunning(test)
    reactor.run()

当我向程序发送信号“TERM”时,当我按下键盘上的Ctrl-C“睡眠”停止时,继续执行“睡眠”。 (Ctrl-C不等同于信号TERM?)为什么?如何在向该程序发送信号“TERM”后杀死“睡眠”?

1 个答案:

答案 0 :(得分:4)

Ctrl-C将SIGINT发送到整个前台进程组。这意味着它会被发送到你的Twisted程序和sleep子进程。

如果你想在Python进程退出时终止睡眠过程,那么你可能需要一个在关闭之前触发器:

def killSleep():
    # Do it, somehow

reactor.addSystemEventTrigger('before', 'shutdown', killSleep)

在编写示例代码时,killSleep很难实现。 getProcessOutput没有给你一些容易让孩子被杀的东西(例如,你不知道它的pid)。如果您使用reactor.spawnProcess和自定义ProcessProtocol,则会解决此问题 - ProcessProtocol将连接到具有signalProcess方法的流程传输,您可以使用该方法发送SIGTERM(或任何你喜欢的)到子进程。

您也可以忽略SIGINT和此点,然后手动将其传递给整个流程组:

import os, signal

def killGroup():
    signal.signal(signal.SIGINT, signal.SIG_IGN)
    os.kill(-os.getpgid(os.getpid()), signal.SIGINT)

reactor.addSystemEventTrigger('before', 'shutdown', killGroup)

忽略SIGINT,因为Twisted进程已经关闭而另一个信号没有任何好处(并且可能会混淆它或至少导致报告虚假错误)。向-os.getpgid(os.getpid())发送信号是如何将其发送到整个流程组。