在守護程式操作中,使用 SIGTERM (TERM) 訊號終止進程可能會突然中斷關鍵任務。為了解決這個問題,讓我們探索如何優雅地處理這個訊號。
給定一個用Python 編寫的簡單守護程序:
def mainloop(): while True: # Perform important jobs # Sleep
使用啟動-停止對其進行守護進程-daemon 在終止時發送SIGTERM (TERM)。如果在關鍵操作期間收到訊號(例如步驟 #2),它將立即終止。
嘗試使用 signal.signal( 處理訊號事件signal.SIGTERM, handler) 也可以中斷目前執行並將控制重定向到處理程序。
為了避免中斷目前執行,我們可以建立一個單獨的執行緒來處理 TERM 訊號。該線程可以設定 shutdown_flag = True,允許主循環優雅退出。
這是一個基於類別的優雅訊號處理解決方案:
import signal import time class GracefulKiller: kill_now = False def __init__(self): signal.signal(signal.SIGINT, self.exit_gracefully) signal.signal(signal.SIGTERM, self.exit_gracefully) def exit_gracefully(self, signum, frame): self.kill_now = True if __name__ == '__main__': killer = GracefulKiller() while not killer.kill_now: time.sleep(1) print("doing something in a loop ...") print("End of the program. I was killed gracefully :)")
這個解決方案允許守護程式優雅地處理SIGTERM,確保關鍵操作可以終止前完成。它還提供了一個乾淨且可維護的實現,用於在多線程環境中處理訊號。
以上是如何在 Python 守護程式中優雅地處理 SIGTERM 訊號?的詳細內容。更多資訊請關注PHP中文網其他相關文章!