m0m*_*eni 7 python daemon python-daemon
我正在尝试在python中创建一个守护进程,我遇到了python-daemon包.有趣的是,我看到它使用的最常见的方式甚至不是那些非常稀疏的文档告诉你做的事情
import os
import grp
import signal
import daemon
import lockfile
from spam import (
initial_program_setup,
do_main_program,
program_cleanup,
reload_program_config,
)
context = daemon.DaemonContext(
working_directory='/var/lib/foo',
umask=0o002,
pidfile=lockfile.FileLock('/var/run/spam.pid'),
)
context.signal_map = {
signal.SIGTERM: program_cleanup,
signal.SIGHUP: 'terminate',
signal.SIGUSR1: reload_program_config,
}
mail_gid = grp.getgrnam('mail').gr_gid
context.gid = mail_gid
important_file = open('spam.data', 'w')
interesting_file = open('eggs.data', 'w')
context.files_preserve = [important_file, interesting_file]
initial_program_setup()
with context:
do_main_program()
Run Code Online (Sandbox Code Playgroud)
相反,人们使用它像这样:
#!/usr/bin/python
import time
from daemon import runner
class App():
def __init__(self):
self.stdin_path = '/dev/null'
self.stdout_path = '/dev/tty'
self.stderr_path = '/dev/tty'
self.pidfile_path = '/tmp/foo.pid'
self.pidfile_timeout = 5
def run(self):
while True:
print("Howdy! Gig'em! Whoop!")
time.sleep(10)
app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()
Run Code Online (Sandbox Code Playgroud)
此处和此线程中的示例如何在Python中创建守护程序?
那么有谁能告诉我如何按预期使用包装?有0个示例可以按文档指定的方式使用它.
aba*_*ert 12
首先,你无法找到好的文档的原因是,据我所知,没有人写过它.当Ben Finney提出PEP时,有很多兴趣,但是当他要求其他人接管项目并支持它时,没有人这样做,所以...超出PEP,以及项目docs目录中的稀疏文档,除了解释事物的来源之外别无他物.
A DaemonContext是您创建守护进程的方式.它的API被广泛使用,并且是唯一被提议成为stdlib中公共接口一部分的部分.来自Debian,Ubuntu和RedHat/Fedora项目的人员参与了初步讨论,并根据他们将发行版移动的经验纳入了变更systemd.
A DaemonRunner包装一个DaemonContext基于守护进程的守护进程和一个控制工具(ala apachectl).这实现了一个"服务",这只是从许多其他不同方式运行守护进程的一种方式.
通常,您不希望这样 - 如果您想构建"服务",您通常只想使用a实现守护程序daemon.DaemonContext,让systemd或者launchd或者它们的旧前辈通过调用该守护进程来管理服务.因此,为简单起见,PEP明确表示服务超出了daemon模块应该尝试的范围.
但是在python-daemon分发中有服务代码.它没有完整记录,因为它只是使用守护进程的一种方法的示例.
它似乎确实有效,多年来它一直在维护和更新.所以,如果你想要一个apachectl类型的工具,我认为使用一个DaemonRunner; 只要确保你阅读文档字符串并编写一些测试,以确保它正在做你想要的.