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

标签 python linux python-2.7 ubuntu

是否可以检测和中断 linux (Ubuntu 16.04) 关机信号(例如电源按钮被点击或电池电量耗尽)。我有一个始终录制视频的 Python 应用程序,我想检测此类信号,因此我在操作系统关闭之前正确关闭了录制。

最佳答案

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

为了验证这是否真的有效,我在两个 Ubuntu 虚拟机(12.04 和 16.04)上尝试了以下脚本。系统在发出 SIGKILL 之前等待 10 秒 (12.04/upstart) 或 90 秒 (16.04/systemd)。

该脚本会忽略 SIGHUP(否则也会不正常地终止进程)并将自 SIGTERM 信号接收到文本文件后连续打印时间。

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

python signaltest.py &
disown

信号测试.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。

关于Python检测linux关机并在关机前运行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39275948/

相关文章:

c++ - 使用 move_pages() 移动大页面?

linux - 更改 Linux 帧缓冲区背景颜色

python - 使用 Python 分隔最后出现的数字的正则表达式

python - 尝试读取 image2d 时非常小的 OpenCL 内核上令人费解的错误(使用 pyopencl)

Python FTP 下载不工作

python - Excel电子表格读取特定列python

Python读取PDF文件

python - 关于在numpy中设置网格并填充相应的多维数组

c++ - 怎么知道哪段内存全为零

python - 加速Python应用行明智函数