是否有可能检测并中断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脚本。