在守护进程操作中,使用 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中文网其他相关文章!