Python 扭曲程序和术语信号

Python 扭曲程序和术语信号,python,twisted,Python,Twisted,我有一个简单的例子: from twisted.internet import utils,reactor def test: utils.getProcessOutput(executable="/bin/sleep",args=["10000"]) reactor.callWhenRunning(test) reactor.run() 从twisted.internet导入utils,reactor def测试: utils.getProcessO

我有一个简单的例子:

from twisted.internet import utils,reactor def test: utils.getProcessOutput(executable="/bin/sleep",args=["10000"]) reactor.callWhenRunning(test) reactor.run() 从twisted.internet导入utils,reactor def测试: utils.getProcessOutput(可执行文件=“/bin/sleep”,args=[“10000”]) 反应堆运行时的呼叫(测试) 反应堆运行()
当我向程序发送信号“TERM”时,“sleep”继续执行,当我按下键盘上的Ctrl-C时,“sleep”停止。(Ctrl-C不是等效的信号项?)为什么?如何在向该程序发送信号“TERM”后终止“sleep”?

Ctrl-C向整个前台进程组发送信号。这意味着它会被发送到Twisted程序和sleep child进程

如果希望在Python进程退出时终止休眠进程,则可能需要关闭前触发器:

在编写示例代码时,
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())
是将其发送到整个进程组的方法

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)