Python在closures之前检测到linuxclosures并运行一个命令

是否有可能检测并中断Linux(Ubuntu 16.04)关机信号(例如,电源button被点击或电池电量耗尽)。 我有一个总是录制video的python应用程序,我想检测这样的信号,所以我closures录音之前正常closures操作系统。

当linux被关闭的时候,所有的进程都会收到SIGTERM ,如果在某个超时之后它们不会终止,那么它们会被SIGKILL终止。 您可以实现一个信号处理程序,使用signal模块正确关闭您的应用程序。 systemd (相对于早期的Ubuntu版本中的upstart )另外在关机时发送SIGHUP

为了证明这实际上起作用,我在两个Ubuntu虚拟机(12.04和16.04)上尝试了以下脚本。 在发出SIGKILL之前,系统等待10s(12.04 / upstart)或90s(16.04 / systemd)。

这个脚本会忽略SIGHUP (否则它会不正常地终止进程),并且会不断的将SIGTERM信号接收到的时间打印到一个文本文件中。

注意我用disown (内置的bash命令)从终端分离进程。

 python signaltest.py & disown 

signaltest.py

 import signal import time stopped = False out = open('log.txt', 'w') def stop(sig, frame): global stopped stopped = True out.write('caught SIGTERM\n') out.flush() def ignore(sig, frsma): out.write('ignoring signal %d\n' % sig) out.flush() signal.signal(signal.SIGTERM, stop) signal.signal(signal.SIGHUP, ignore) while not stopped: out.write('running\n') out.flush() time.sleep(1) stop_time = time.time() while True: out.write('%.4fs after stop\n' % (time.time() - stop_time)) out.flush() time.sleep(0.1) 

打印到log.txt的最后一行是:

 10.1990s after stop 

为12.04和

 90.2448s after stop 

为16.04。

看看这个基本上,把一个脚本放在/etc/rc0.d/中,用正确的名字,然后调用python脚本。