你如何按照它的文档规定使用python-daemon?

时间:2015-05-23 03:23:34

标签: python daemon python-daemon

我试图在python中创建一个守护进程,并且我遇到了python-daemon包。关于它的有趣之处在于,我所见过的最常见的方式,即使是非常稀疏的documentation告诉你要做的事情

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()

相反,人们会这样使用它:

#!/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()

示例here以及此帖子How do you create a daemon in Python?

那么有人能告诉我这个包应该如何按预期使用吗?有0个示例可以按文档指定的方式使用它。

2 个答案:

答案 0 :(得分:11)

首先,您无法找到好的文档的原因是,据我所知,没有人写过它。当Ben Finney提出PEP时,有很多兴趣,但是当他要求其他人接管项目并支持它时,没有人这样做,所以...超出PEP,以及项目docs目录中的稀疏文档,除了解释事物的来源之外别无他法。

DaemonContext是您创建守护程序的方式。它的API被广泛使用,并且是唯一被提议成为stdlib中公共接口一部分的部分。来自Debian,Ubuntu和RedHat / Fedora项目的人员参与了初步讨论,并根据他们将发行版转移到systemd的经验进行了变更。

DaemonRunner包含一个基于DaemonContext的守护程序和一个控制工具(ala apachectl)。这实现了一个“服务”,这只是通过许多其他方式运行守护进程的一种方式。

通常,你不想要这个 - 如果你想建立一个"服务",你通常只希望使用daemon.DaemonContext来实现守护进程,并让{{1或者systemd或者他们的旧前辈通过调用该守护进程来管理服务。因此,为简单起见,PEP明确表示服务超出了launchd模块应该尝试的范围。

但是daemon发行版中有服务代码。它没有完整记录,因为它只是使用守护进程的一种方式的一个例子。

它似乎确实有效,并且多年来一直在维护和更新。所以,如果你想要一个python-daemon类型的工具,我认为使用apachectl是有意义的。只要确保你阅读文档字符串并编写一些测试,以确保它做你想做的事。

答案 1 :(得分:4)

作为abarnert sayspython-daemon文档旨在说明如何编写守护程序进程:一个程序,它将自己与控制终端分离,没有父进程并在后台运行。

python-daemon代码并未规定如何在服务中使用该守护程序。要实施该服务,您需要运行该守护程序systemdinitupstartlaunchd所有人都可以胜任。< / p>

作为(未记录的)示例,python-daemon代码库包含一个简单的示例运行器。它不是编写守护程序的一部分,而且存在更好的工具。

使用记录的daemon.daemon API编写守护程序,并使用操作系统附带的运行程序运行它。