如何正确处理和保留系统关闭(和SIGTERM)以完成其在Python中的工作?

AsT*_*TeR 6 python unix

基本需求:我有一个Python守护进程,它通过os.system调用另一个程序.我的愿望是能够正确处理系统关闭或SIGTERM,以便让被调用的程序返回然后退出.

我已经尝试过:我尝试过使用信号的方法:

import signal, time

def handler(signum = None, frame = None):
    print 'Signal handler called with signal', signum
    time.sleep(3)
    #here check if process is done
    print 'Wait done'

signal.signal(signal.SIGTERM , handler)

while True:
    time.sleep(6)
Run Code Online (Sandbox Code Playgroud)

time.sleep的使用似乎不起作用,并且永远不会调用第二个打印.

我读过几句关于atexit.register(handler)而不是signal.signal(signal.SIGTERM,handler)的文字,但没有在kill上调用任何内容.

Sam*_*ins 9

您的代码几乎可以正常工作,除非您在清理后忘记退出.

我们经常需要捕获各种其他信号,如INT,HUP和QUIT,但与守护进程不同.

import sys, signal, time

def handler(signum = None, frame = None):
    print 'Signal handler called with signal', signum
    time.sleep(1)  #here check if process is done
    print 'Wait done'
    sys.exit(0)

for sig in [signal.SIGTERM, signal.SIGINT, signal.SIGHUP, signal.SIGQUIT]:
    signal.signal(sig, handler)

while True:
    time.sleep(6)
Run Code Online (Sandbox Code Playgroud)

在许多系统上,普通过程在关机期间没有太多时间进行清理.为了安全起见,您可以编写一个init.d脚本来停止守护进程并等待它.