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

时间:2016-01-08 11:43:45

标签: python signals sigterm

我通过SIGTERM向我的服务器发送start-stop-daemon信号。正如预期的那样,服务器在收到信号时会关闭。现在我想在收到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正在处理信号,因此,默认处理程序也会与我的处理程序一起被调用。知道需要做什么吗?

1 个答案:

答案 0 :(得分:1)

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

你真正想要的是“忽略”信号,然后在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)

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