0

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

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

4

1 回答 1

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)

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

于 2016-01-08T11:57:37.930 回答