gpt4 book ai didi

python - 关闭 Python 守护进程时运行代码

转载 作者:太空狗 更新时间:2023-10-29 11:42:05 28 4
gpt4 key购买 nike

我正在使用著名的 code referenced herehere在 Python 中做一个守护进程,像这样:

import sys, daemon

class test(daemon.Daemon):
def run(self):
self.db = somedb.connect() # connect to a DB
self.blah = 127
with open('blah0.txt', 'w') as f:
f.write(self.blah)
# doing lots of things here, modifying self.blah

def before_stop(self):
self.db.close() # properly close the DB (sync to disk, etc.)
with open('blah1.txt', 'w') as f:
f.write(self.blah)

daemon = test(pidfile='_.pid')

if 'start' == sys.argv[1]:
daemon.start()
elif 'stop' == sys.argv[1]:
daemon.before_stop() # AttributeError: test instance has no attribute 'blah'
daemon.stop()

问题是当调用 ./myscript.py stop 并因此调用 daemon.before_stop() 时,不再有对 self.blah< 的引用!

AttributeError: test instance has no attribute 'blah'

因此使用这种守护进程方法,在停止守护进程之前不可能访问守护进程的变量...

问题:如何访问守护类之前的变量:

  • 使用 ./myscript.py stop 停止

  • 被 SIGTERM 停止

  • (被杀?)


编辑:已解决,并且 here is a working daemon code with a quit() method.

最佳答案

守护进程代码向守护进程发送一个 SIGTERM 信号,要求它停止。如果您希望某些东西由守护进程本身运行,则它必须从信号处理程序或从 atexit.register 调用的方法运行。

daemonize 方法已经安装了这样一个方法,只需从那里调用 beforestop:

# this one could be either in a subclass or in a modified base daemeon class
def delpid(self):
if hasattr(self, 'before_stop'):
self.before_stop()
os.remove(self.pidfile)

# this one should be in subclass
def before_stop(self):
self.db.close() # properly close the DB (sync to disk, etc.)
with open('blah1.txt', 'w') as f:
f.write(self.blah)

但这还不够! Python 标准库文档对 atexit 说:

The functions registered via this module are not called when the program is killed by a signal not handled by Python

由于该进程需要接收 SIGTERM 信号,因此您必须安装一个处理程序。如图一active state recipe ,这太简单了:只要程序在收到信号时就停止:

...
from signal import signal, SIGTERM
...

atexit.register(self.delpid)
signal(SIGTERM, lambda signum, stack_frame: exit(1))

关于python - 关闭 Python 守护进程时运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40391812/

28 4 0
文章推荐: css - parent 的填充会影响 Chrome 中 child 的垂直相对填充
文章推荐: css - 如何在 javaFX FXML 中使用 CSS 设置 SVG 样式
文章推荐: html -
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com