如何在Python中创建一个能够响应signalSIGTERM信号的守护进程
发布时间:2023-12-15 12:20:21
在Python中创建一个能够响应signal.SIGTERM信号的守护进程需要使用signal模块和multiprocessing模块。下面是一个示例代码,该代码创建一个守护进程,当接收到SIGTERM信号时,进程将正常退出。
import multiprocessing
import signal
import time
def worker_process():
# 定义一个进程的工作函数,可以替换为自己的具体逻辑
while True:
print("Working...")
time.sleep(1)
def signal_handler(signum, frame):
# 定义一个信号处理函数,在接收到SIGTERM信号时让进程退出
print("Received SIGTERM signal")
raise SystemExit(0)
def run_daemon():
# 创建一个子进程
p = multiprocessing.Process(target=worker_process)
# 注册SIGTERM信号处理函数
signal.signal(signal.SIGTERM, signal_handler)
# 设置子进程为守护进程
p.daemon = True
p.start()
# 等待子进程终止
p.join()
if __name__ == "__main__":
run_daemon()
在上面的代码中,定义了一个worker_process函数作为子进程的工作函数,它会打印"Working..."并间隔1秒钟执行一次。signal_handler函数是信号处理函数,当接收到SIGTERM信号时,会打印"Received SIGTERM signal"并调用SystemExit(0)以正常退出进程。
run_daemon函数是主函数,在其中创建了一个子进程并设置为守护进程。然后使用signal.signal函数将SIGTERM信号的处理函数注册为signal_handler。最后,使用p.join()等待子进程终止。
将上述代码保存为一个Python文件,运行该文件将创建一个守护进程。当向该进程发送SIGTERM信号时,进程将正常退出,打印"Received SIGTERM signal"。
$ python daemon.py Working... Working... Working... ^C^C^C
注意:在某些操作系统上,例如Windows,SIGTERM信号可能不可用。在这种情况下,可以考虑使用其他信号,如SIGINT(Ctrl+C),或使用第三方库,如psutil,来实现守护进程的方式。
