2011-07-19 46 views
5

我有一个简单的例子:扭曲程序和TERM信号

 
    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”到这个程序后如何杀死“睡眠”?

回答

4

Ctrl-C向整个前台进程组发送SIGINT。这意味着它会发送到您的Twisted程序和睡眠子进程。

如果你想杀死每当Python进程要退出睡眠过程中,那么你可能需要一个关机前触发:

def killSleep(): 
    # Do it, somehow 

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

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

你也可以忽略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因为扭曲的进程已关闭,另一信号将没有任何好处(并可能会混淆它,或者至少会导致虚假错误被报告)。发送信号到-os.getpgid(os.getpid())是如何将它发送到您的整个过程组。