2016-01-08 27 views
0

我通过start-stop-daemonSIGTERM信号发送到我的服务器。正如预期的那样,服务器在收到信号时关闭。现在我想在收到SIGTERM后停止我的服务器10秒钟,然后关闭它。为了达到这个目的,我写了Python:覆盖默认的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: 

我觉得我的代码是不是能告诉蟒蛇的信号被处理,所以,默认处理程序也正在跟我一起的处理程序调用。任何想法需要做什么?

回答

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) 

你想也切换到“关断模式”,其中例如服务器不应该 接受新的连接等。

+0

感谢它的工作。关于“关机模式”,代码似乎在我介绍它后立即停止工作(更正了“shutdownMode”,“shutdown_mode”错字)。即使在sigterm_handler的开头创建了shutdown_mode日志,也停止了该功能。 – akipro

+0

@akipro谢谢。 “shutdown_mode”在缺少“全局”声明时不起作用。它现在应该工作。 – jofel

+0

啊......应该已经注意到了。再次感谢。 – akipro