Ctrl-C 向整个前台进程组发送 SIGINT。这意味着它会被发送到您的 Twisted 程序和 sleep 子进程。
如果您想在 Python 进程即将退出时终止睡眠进程,那么您可能需要一个 before shutdown 触发器:
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 进程已经关闭,另一个信号不会有任何好处(并且可能会混淆它或至少导致报告虚假错误)。向-os.getpgid(os.getpid()) 发送信号就是如何将信号发送到您的整个进程组。