Python:覆盖默认的 SIGTERM 处理程序

Python: Override default SIGTERM handler

我正在通过 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 信号正在处理,因此默认处理程序也与我的处理程序一起被调用。知道需要做什么吗?

问题是你的sigterm_handler。它会尽快阻止您的服务器 它收到 SIGTERM 信号 10 秒,然后将其关闭。

你真正想要的是"ignoring"信号然后10s后退出服务器 (例如使用另一个信号):

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)

您还想切换到 "shutdown mode",例如服务器不应该 接受新连接等