2016-01-08 30 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