【问题标题】:Python: Override default SIGTERM handlerPython:覆盖默认的 SIGTERM 处理程序
【发布时间】:2016-04-13 02:14:46
【问题描述】:

我正在通过start-stop-daemon 向我的服务器发送SIGTERM 信号。正如预期的那样,服务器在收到信号时关闭。现在我想在收到SIGTERM 后将服务器暂停 10 秒,然后将其关闭。为了实现这一点,我写了

def sigterm_handler(signum):
    time.sleep(10)
    sys.exit(0)    

Class server(object):
    .
    .

    def __call__()
        signal.signal(signal.SIGTERM, sigterm_handler)
        #some code

    .
    .

现在服务器在收到信号后不会等待 10 秒。一旦发送信号,它就会关闭(在记录器中检查)。

此外,以下消息在我的终端上会暂停 10 秒。

* Stopping Server:

我认为我的代码无法告诉 python 正在处理信号,因此默认处理程序也与我的处理程序一起被调用。知道需要做什么吗?

【问题讨论】:

    标签: python signals sigterm


    【解决方案1】:

    问题是你的sigterm_handler。它会立即阻止您的服务器 它接收 SIGTERM 10 秒,然后将其关闭。

    您真正想要的是“忽略”信号,然后在 10 秒后退出服务器 (例如使用另一个信号):

    shutdown_mode=False
    
    def alarm_handler(signum, frame):
            sys.exit(0)
    
    def sigterm_handler(signum):
         global shutdown_mode
         if not shutdown_mode:
                shutdown_mode=True
                signal.signal(signal.SIGALRM, alarm_handler)
                signal.alarm(10)
    

    您还想切换到“关机模式”,例如服务器不应该 接受新的连接等。

    【讨论】:

    • 谢谢它的工作。关于“关机模式”,我一介绍代码似乎就停止了工作(更正了“shutdownMode”、“shutdown_mode”错字)。甚至在 sigterm_handler 开始时记录 shutdown_mode 也会停止该功能。
    • @akipro 谢谢。 “shutdown_mode”没有工作,因为它的global 声明丢失了。它现在应该可以工作了。
    • 啊……应该已经注意到了。再次感谢。
    • 嘿嘿,好像在 sigterm_handler 中做除了设置警报之外的任何其他操作,比如设置 shutdown_mode 或任何其他变量,服务器再次立即停止。
    • 为了调试,在 shell 中运行服务器。可能,你得到一个 python 错误。对我来说,例如设置变量有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2020-11-27
    • 2016-06-04
    • 2012-07-09
    • 2016-10-24
    • 1970-01-01
    相关资源
    最近更新 更多