今天写个常驻服务,使用了multiprocessing库,新的process设置了daemon属性,想通过signal来主动关闭服务,主进程进行了信号绑定,代码如下:
def handler(signum, frame):
logger.info("got signal:%d" % signum)
global quit
quit = True
signal.signal(signal.SIGINT, handler)
signal.signal(signal.SIGTERM, handler)
这样设置后,发现Ctrl+C后,父子进程均收到了信号,但是子进程并没有终止,父进程也hang住了。
查看日志,发现在子进程收到signum为2(signal.SIGINT)的信号后,又收到了15(signal.SIGTERM),这说明daemon属性设置是为了父进程往子进程发送15的信号,但是如果15也被主动捕获了,导致默认处理15的退出逻辑并没有再执行,而父进程没有收到子进程的退出状态,也hang住了,将15的捕获删除后,符合预期。