Ctrl-C向整个前台进程组发送SIGINT。这意味着它会发送到您的Twisted程序和睡眠子进程。
如果你想杀死每当Python进程要退出睡眠过程中,那么你可能需要一个关机前触发:
def killSleep():
# Do it, somehow
reactor.addSystemEventTrigger('before', 'shutdown', killSleep)
当你的示例代码编写,killSleep
很难实行。 getProcessOutput
不会给你轻易让孩子被杀的东西(例如,你不知道它的pid)。如果使用reactor.spawnProcess
和自定义ProcessProtocol
,则可以解决此问题 - ProcessProtocol
将连接到具有可用于向子进程发送SIGTERM(或任何您喜欢的)的signalProcess
方法的进程传输。
你也可以忽略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因为扭曲的进程已关闭,另一信号将没有任何好处(并可能会混淆它,或者至少会导致虚假错误被报告)。发送信号到-os.getpgid(os.getpid())
是如何将它发送到您的整个过程组。