【问题标题】:Python detect linux shutdown and run a command before shutting downPython检测linux关机并在关机前运行命令
【发布时间】:2017-01-09 14:22:23
【问题描述】:

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

【问题讨论】:

  • 我不久前在 AU 上问过一个类似的问题。虽然问题是注销,但答案也包括关机。 askubuntu.com/questions/720380/… 答案还提到了python dbus 绑定。

标签: python linux python-2.7 ubuntu


【解决方案1】:

当 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.

【讨论】:

  • @JacobVlijm 你真的试过了吗?
  • 不,但如果我正确,程序不会中断?
  • @JacobVlijm 我尝试使用 Ubuntu 虚拟机,如果进程没有响应 SIGTERM,则关闭延迟 10 秒
  • 问题是这是否足以保存和关闭视频应用程序。
  • 谢谢大家,我现在试试这个并告诉你 - 是的,10 秒足以让我完成所有流程
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2020-11-01
    • 2013-04-12
    • 1970-01-01
    相关资源
    最近更新 更多