Python 扭曲程序和术语信号
我有一个简单的例子: 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”]) 反应堆运行时的呼叫(测试) 反应堆运行()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
当我向程序发送信号“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)