【问题标题】:Python: React in script before shutdownPython:关闭前在脚本中做出反应
【发布时间】:2022-03-06 01:51:58
【问题描述】:

我有一个在启动时作为 cronjob 启动的 python 脚本来收集测量数据: @reboot python /path/to/my_script.py

Linux 机器每天在特定时间作为 cronjob 重新启动: 57 23 * * * sudo reboot

在重新启动时,我仍然有尚未保存的测量数据,需要将其传输到可能需要几秒钟的网站。从我看到的重新启动或关闭命令会给出一些提前警告以正常关闭,但是我还没有找到一种方法来捕捉它。 到目前为止,我一直在尝试signal.SIGTERM, signal.SIGHUP ,但这些并没有削减它,也不会对关机命令做出反应。也尝试使用 nohup 并没有产生预期的结果。

关于如何在 Python 脚本中检测关机前的时间有什么建议吗? 干杯 ye_ol_man

【问题讨论】:

  • atexit 模块可能是满足您要求的最简单方法。
  • 很遗憾没有。 atexit 在我停止脚本本身时做出反应,但是当我执行 reboot then 时,我看不到已注册的处理程序已执行。

标签: python shutdown reboot


【解决方案1】:

到目前为止,我尝试了几种方法,并尝试从 cronjob 的脚本中检测关机本身并没有真正产生任何积极的结果。为了检测关机,我现在发现了这个可行的解决方法:

  • 在 RPi 启动时是否正常启动了工作脚本
  • 在工作脚本中检测 USER1 信号
  • 当检测到 USE1 信号时,工作脚本进入关闭状态
  • 我不只是在 crontab 中重新启动,而是启动了一个单独的 python 脚本,检测我的工作脚本的 PID 并发送 USR1 信号。
import os
import signal
import sys

search_file=sys.argv[1] #name of the script which should be searched for
print(search_file)

output=os.popen('pgrep -f ' + search_file)
my_pid=output.read()
line_pos=my_pid.find('\n') # two PIDs are detected, target-PID and PID of this script
my_pid=int(my_pid[:line_pos]) #first PID is target-PID
print(my_pid)
os.kill(my_pid, signal.SIGUSR1) # os.kill sends the various signals, e.g. SIGUSR1 to PID

这最初不是想要的,但有效。 8o)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 2017-02-28
    • 2013-06-15
    • 2022-09-23
    • 2020-03-31
    相关资源
    最近更新 更多