我有一个简单的例子:
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"后杀死"睡眠"?
Ctrl-C 向整个前台进程组发送 SIGINT。这意味着它会发送到您的 Twisted 程序和睡眠子进程。
如果你想在 Python 进程即将退出时终止睡眠进程,那么你可能需要一个before shutdown触发器:
def killSleep():
# Do it, somehow
reactor.addSystemEventTrigger('before', 'shutdown', killSleep)
Run Code Online (Sandbox Code Playgroud)
正如你的示例代码所写,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)
Run Code Online (Sandbox Code Playgroud)
忽略 SIGINT,因为 Twisted 进程已经关闭,另一个信号不会有任何好处(并且可能会混淆它或至少导致报告虚假错误)。发送信号到-os.getpgid(os.getpid())就是如何将其发送到你的整个进程组。