【问题标题】:Python daemon shows no output for an errorPython 守护程序没有显示错误输出
【发布时间】:2016-01-17 19:57:05
【问题描述】:
我阅读了How do you create a daemon in Python? 和this topic,并尝试编写一个非常简单的守护进程:
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 有什么问题?
【问题讨论】:
标签:
python
daemon
python-daemon
【解决方案1】:
daemon.DaemonContext() 的选项 working_directory 具有默认故障值 /,即您的程序可能无权在那里创建新文件。
【解决方案2】:
这里描述的问题由 J.J. 解决。哈卡拉的回答。
另外两个(重要的)事情:
Sander's code(提到here)比python-daemon更好。它更可靠。仅举一个例子:尝试用python-daemon 启动两次同一个守护进程:丑陋的大错误。使用 Sander 的代码:一个很好的通知“守护程序已经在运行”。
对于那些无论如何都想使用python-daemon 的人:DaemonContext() 只做一个守护进程。 DaemonRunner()做一个守护进程+控制工具,允许做python script.py start或者stop等。
【解决方案3】:
它有一个问题,它无法告诉你它有什么问题:-)
根据定义,守护进程与父进程和任何控制终端分离。因此,如果它有话要说——比如错误消息——它需要在成为守护进程之前进行安排。
来自the python-daemon FAQ document:
为什么打开守护进程上下文后输出停止?
PEP 3143_ 中的指定行为包括要求
从控制终端分离进程(以允许进程
继续作为守护进程运行),并关闭所有文件描述符而不是
已知一旦分离是安全的(以确保任何文件继续
使用都在守护进程的控制下)。
如果您希望进程通过系统流生成输出
‘sys.stdout’和‘sys.stderr’,设置‘DaemonContext’的‘stdout’
和/或“stderr”选项到类似文件的对象(例如“流”
“logging.Handler”实例的属性)。如果这些对象有文件
描述符,它们将在守护程序上下文打开时保留。
设置有效的通信渠道,例如日志文件。使用files_preserve 选项确保您打开的文件没有与其他所有文件一起关闭。然后将任何错误记录到该通道。