【问题标题】:Twisted program and TERM signal扭曲程序和 TERM 信号
【发布时间】:2011-07-19 07:49:39
【问题描述】:

我有一个简单的例子:

从 twisted.internet 导入 utils、reactor 定义测试: utils.getProcessOutput(executable="/bin/sleep",args=["10000"]) reactor.callWhenRunning(测试) 反应堆.run()

当我向程序发送信号“TERM”时,“睡眠”继续执行,当我在键盘“睡眠”停止时按 Ctrl-C。 (Ctrl-C 不是等效信号 TERM?)为什么?向该程序发送信号“TERM”后如何杀死“睡眠”?

【问题讨论】:

    标签: python twisted


    【解决方案1】:

    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()) 发送信号就是如何将信号发送到您的整个进程组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 2017-11-30
      • 1970-01-01
      相关资源
      最近更新 更多