7

我正在尝试在 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()

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

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

此处和此线程中的示例How do you create a daemon in Python?

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

4

2 回答 2

12

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

ADaemonContext是您打算创建守护程序的方式。它的 API 被广泛淘汰,并且是唯一被提议作为标准库中公共接口一部分的部分。来自 Debian、Ubuntu 和 RedHat/Fedora 项目的人员参与了最初的讨论,并根据他们将发行版迁移到systemd.

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

通常,您不希望这样——如果您想构建一个“服务”,您通常只想使用 a 来实现守护进程daemon.DaemonContext,并让systemdlaunchd或他们的老前辈通过调用该守护进程来管理服务。因此,为了简单起见,PEP 明确表示服务超出了daemon模块应尝试的范围。

但是python-daemon分发中有服务代码。它没有完全记录,因为它只是使用守护程序的一种方法的示例。

它似乎确实有效,并且多年来肯定得到了维护和更新。所以,如果你想要一个-type 工具,我认为使用;apachectl是有意义的。DaemonRunner只需确保您阅读了文档字符串并编写了一些测试以确保它正在执行您想要的操作。

于 2015-05-23T04:13:00.420 回答
4

正如abarnert 所说,该python-daemon文档旨在展示如何编写守护进程:一个将自身与控制终端分离并且没有父进程并在后台运行的程序。

python-daemon代码没有规定如何在服务中使用该守护程序。要实现该服务,您需要一些东西来运行该守护程序systemdinitupstartlaunchd都可以完成这项工作。

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

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

于 2016-02-01T23:47:09.403 回答