在shutdown命令下python没有收到SIGTERM信号

时间:2014-06-09 20:14:42

标签: python signals raspberry-pi raspbian

我已经使用python为raspberryPi编程了几个月了,我正在尝试制作我的脚本"表现良好"收到SIGTERM后,收尾(关闭文件并确保没有写入SD的写入)。

遵循关于SO的建议(12)如果我手动终止进程(即 kill {进程号} ),我能够处理SIGTERM但是如果我发送shutdown命令(即 shutdown -t 30 now )我的处理程序永远不会被调用。

我也尝试注册所有信号并检查关机事件发送的信号,但我没有得到任何信号。

这是一个简单的示例代码:

import time
import signal
import sys


def myHandler(signum, frame):
    print "Signal #, ", signum
    sys.exit()

for i in [x for x in dir(signal) if x.startswith("SIG")]:
    try:
        signum = getattr(signal, i)
        signal.signal(signum, myHandler)
        print "Handler added for {}".format(i)
    except RuntimeError,m:
        print "Skipping %s"%i
    except ValueError:
        break
while True:
    print "goo"
    time.sleep(1)

任何想法都将受到高度赞赏.. =)

1 个答案:

答案 0 :(得分:0)

这段代码对我的Rasberry pi有用,我可以在重启后看到output.log文件中的正确输出:

logging.basicConfig(level=WARNING,
                    filename='output.log',
                    format='%(message)s')   
def quit():
    #cleaning code here
    logging.warning('exit')
    sys.exit(0)

def handler(signum=None, frame=None):
    quit()

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

def restart():
    command = '/sbin/shutdown -r now'
    process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
    output = process.communicate()[0]
    logging.warning('%s'%output)

restart()

也许你的终端在python脚本之前处理信号,所以你实际上看不到任何东西。尝试在文件中查看输出(使用日志记录模块或您喜欢的方式)。