首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按照文档规定的方式使用python-daemon?

如何按照文档规定的方式使用python-daemon?
EN

Stack Overflow用户
提问于 2015-05-23 11:23:34
回答 2查看 16.3K关注 0票数 7

我正在尝试用python创建一个守护进程,我遇到了python-daemon包。有趣的是,我所见过的使用它的最常见的方式甚至不是非常稀疏的documentation告诉您要做的事情

代码语言:javascript
复制
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()

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

代码语言:javascript
复制
#!/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个示例可以找到,它们按照文档指定的方式使用它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-23 12:13:00

首先,你找不到好的文档的原因是,据我所知,从来没有人写过它。当Ben Finney提出PEP时,有很多人感兴趣,但当他要求其他人接管并支持该项目时,没有人同意,所以…除了PEP和项目的docs目录中的稀疏文档之外,除了源代码之外,实际上没有什么可以解释的。

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

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

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

但是在python-daemon发行版中有服务的代码。它没有完整的文档,因为它只是使用守护进程的一种方式的一个示例。

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

票数 12
EN

Stack Overflow用户

发布于 2016-02-02 07:47:09

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

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

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

按照文档所述,使用daemon.daemon应用程序接口编写守护进程,并使用操作系统附带的运行程序运行它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30408589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档