2013-07-17 46 views
2

我在做這樣的事情SIGTERM處理程序調用多次

def exitHandler(self, *args): 
    self.stopThreads() 
    sys.exit(2) 

,我註冊這個函數在我self.run(與守護進程的PROGRAMM工作)

signal.signal(signal.SIGTERM, self.exitHandler) 

self.stopThreads( )有時需要一段時間才能完成。我停止這些線程啓動的子進程。當信號處理程序被調用多次,我得到的錯誤信息是這樣的:

Exception SystemExit: 2 in <bound method Popen.__del__ of <subprocess.Popen object at 0x929d10c>> ignored 

一切都很好,甚至與忽視之外,所有我處理的線程結束,因爲他們應該。我很好奇我做錯了什麼,以及如何擺脫忽略的異常錯誤。

回答

1

問題似乎是stopThreads()sys.exit()的工作不可重入,而第二個SIGTERM導致其中一個或兩個被調用。

現在,您不能阻止SIGTERM被多次傳遞,但您可以重新編寫邏輯以適應它。通常的(通常是正確的)建議是重構你的信號處理器來簡單地設置一個標誌,並檢查你的主循環中的那個標誌:

def termHandler(self, *args): 
    global flag_exit 
    global exit_code 

    flag_exit = True 
    exit_code = 2 


... in the main loop ... 

    while not flag_exit: 
     do_work() 

    self.stopThreads() 
    sys.exit(exit_code)