欢迎访问宙启技术站
智能推送

如何在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,来实现守护进程的方式。