我已经使用python为raspberryPi编程了几个月了,我正在尝试制作我的脚本"表现良好"收到SIGTERM后,收尾(关闭文件并确保没有写入SD的写入)。
遵循关于SO的建议(1,2)如果我手动终止进程(即 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)
任何想法都将受到高度赞赏.. =)
答案 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脚本之前处理信号,所以你实际上看不到任何东西。尝试在文件中查看输出(使用日志记录模块或您喜欢的方式)。