Python检测linux关闭并在关闭之前运行命令

时间:2016-09-01 15:49:08

标签: python linux python-2.7 ubuntu

是否可以检测并中断linux(Ubuntu 16.04)关机信号(例如电源按钮被点击或电池耗尽)。我有一个总是录制视频的python应用程序,我想检测这样的信号,所以我在关机之前正确关闭录制。

2 个答案:

答案 0 :(得分:2)

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

为了确认这实际上有效,我在两个Ubuntu VM(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。

答案 1 :(得分:0)

查看this 基本上,将一个脚本放在/etc/rc0.d/中,并使用正确的名称并执行对python脚本的调用。