扭曲程序和TERM信号

5
我有一个简单的例子:
    from twisted.internet import utils,reactor

    def test:
        utils.getProcessOutput(executable="/bin/sleep",args=["10000"])
reactor.callWhenRunning(test) reactor.run()
当我向程序发送 "TERM" 信号时,“sleep” 继续执行,但是当我在键盘上按下 Ctrl-C 时,“sleep” 停止了。(Ctrl-C 不等同于信号 TERM 吗?)为什么?如何在向该程序发送 "TERM" 信号后杀死 "sleep"?
1个回答

4

Ctrl-C会向整个前台进程组发送SIGINT信号,这意味着它会发送给你的Twisted程序和sleep子进程。

如果你想在Python进程退出时终止sleep进程,则可能需要使用“关闭之前”触发器:

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进程已经在关闭,再发送信号也没有任何好处(并且可能会让Twisted进程混淆或导致虚假错误报告)。向-os.getpgid(os.getpid())发送信号是将其发送到整个进程组的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接