如何让Python守护进程在停止时执行动作

2 投票
1 回答
2644 浏览
提问于 2025-04-17 17:04

我在这里找到了一段代码,用来实现一个简单的守护进程。现在我想知道有没有办法让这个守护进程在被停止之前执行一个动作。我的想法是,在我的脚本中,我使用串口连接到一个外部设备,我希望在关闭守护进程之前,能够干净地关闭这个连接。

在App()类的init循环中,我做了所有的准备和初步设置。接着,run函数负责启动串口连接,丢弃前面几个值,然后开始主循环(这个循环只是从串口连接中获取值,并将它们保存到外部服务器)。

现在,我想做的是添加一个在退出前执行的动作,比如关闭串口连接,并获取一些发送到日志文件的数据总结。

有没有简单的方法可以做到这一点?(或者说,即使是复杂的方法也可以)。

顺便提一下,我也考虑过使用这种方式来创建守护进程,这可能是实现我想做的事情的更简单的方法。

这是我目前的代码:

#standard libraries from python
import logging, sys, time

#3rd party lib
import serial, requests
from daemon import runner

class App():
    def __init__(self):
        #some initialize also including the ones from the example
        serialport = '/dev/ttyACM0'

    def run(self):
        #Serial start
        ser = serial.Serial()
        ser.port = serialport
        ser.open()

        #First values discarded
        for i in range(30):
            ser.readline()[:-1]
        #Yes, that's ugly!
        i = 1

        #Main loop
        while True:
            # Serial retrieve
            values = ser.readline()
            r = requests.get(url, params=values)
            logger.info("%s values sent", str(i))
            values = ''
            i += 1
            time.sleep(3)

app = App()
#daemon starting stuff from example

谢谢你的帮助!

1 个回答

3

这个内容在标准库的atexit模块中有介绍。更具体一点,如果你想在一个对象被删除之前执行一些代码,可以实现一个del方法。

撰写回答