3

我阅读了如何在 Python 中创建守护进程?还有这个主题,并尝试编写一个非常简单的守护进程:

import daemon
import time
with daemon.DaemonContext():
    while True:
        with open('a.txt', 'a') as f:
            f.write('Hi')
        time.sleep(2)

工作python script.py并立即返回终端(这是预期的行为)。但是a.txt从来没有写过,我也没有收到任何错误消息。这个简单有什么问题daemon

4

3 回答 3

2

daemon.DaemonContext()working_directory具有具有默认故障值的选项,/即您的程序可能无权在那里创建新文件。

于 2016-01-17T20:12:42.023 回答
0

它有一个问题,它无法告诉你它有什么问题:-)

根据定义,守护进程与父进程和任何控制终端分离。因此,如果它有话要说——比如错误消息——它需要在成为守护进程之前进行安排。

从常见问题解答文档python-daemon

为什么打开守护进程上下文后输出停止?

_中的指定行为PEP 3143包括要求将进程与控制终端分离(以允许进程继续作为守护进程运行),并关闭所有在分离后不安全的文件描述符(以确保任何文件继续要使用的是在守护进程的控制下)。

如果您希望进程通过系统流“sys.stdout”和“sys.stderr”生成输出,请将“DaemonContext”的“stdout”和/或“stderr”选项设置为类似文件的对象(例如'logging.Handler' 实例的'stream' 属性)。如果这些对象具有文件描述符,它们将在守护程序上下文打开时被保留。

建立一个有效的沟通渠道,例如一个日志文件。files_preserve使用该选项确保您打开的文件没有与其他所有文件一起关闭。然后将任何错误记录到该通道。

于 2016-02-02T00:01:34.300 回答
0

JJ Hakala 的回答解决了这里描述的问题。

两个额外(重要)的事情:

  • Sander 的代码此处提到)优于. python-daemon它更可靠。只是一个例子:尝试启动两次相同的守护进程python-daemon:大丑陋的错误。使用 Sander 的代码:一个很好的通知“守护程序已经在运行”。

  • 对于那些python-daemon无论如何都想使用的人:DaemonContext()只做一个守护进程。DaemonRunner()做一个守护进程+控制工具,允许做python script.py startorstop等​​。

于 2016-01-17T21:25:01.527 回答