在谷歌上搜索显示x2个代码片段。第一个结果是这个代码配方,它有很多文档和解释,以及下面一些有用的讨论。

然而,另一个代码示例虽然不包含这么多文档,但包含了传递启动、停止和重启等命令的示例代码。它还创建了一个PID文件,可以方便地检查守护进程是否已经在运行等。

这些示例都解释了如何创建守护进程。还有其他需要考虑的事情吗?一个样本比另一个更好吗?为什么?


当前回答

当前的解决方案

PEP 3143(标准守护进程库)的参考实现现在作为python-daemon提供。

历史的答案

Sander Marechal的代码样例优于2004年发布的原始代码。我曾经为Pyro贡献了一个daemonizer,但如果我必须重新做的话,可能会使用Sander的代码。

其他回答

YapDi是一个python包。它可用于从脚本内部将python脚本转换为守护进程模式。

当前的解决方案

PEP 3143(标准守护进程库)的参考实现现在作为python-daemon提供。

历史的答案

Sander Marechal的代码样例优于2004年发布的原始代码。我曾经为Pyro贡献了一个daemonizer,但如果我必须重新做的话,可能会使用Sander的代码。

我修改了Sander Marechal的代码示例(@JeffBauer在接受的回答中提到)中的几行代码,以添加一个quit()方法,该方法在守护进程停止之前执行。这有时是非常有用的。

在这儿。

注意:我没有使用“python-daemon”模块,因为文档仍然缺失(参见许多其他SO问题),而且相当模糊(如何使用这个模块从命令行正确地启动/停止一个守护进程?)

虽然你可能更喜欢Python -daemon模块提供的纯Python解决方案,但在libc中有一个daemon(3)函数——至少在BSD和Linux上是这样——它可以做正确的事情。

从python调用它很简单:

import ctypes

ctypes.CDLL(None).daemon(0, 0) # Read the man-page for the arguments' meanings

剩下要做的唯一一件事就是创建(和锁定)pid文件。但你能处理好自己…

经过几年的努力和多次尝试(我尝试了这里给出的所有答案,但最后都有一些小缺点),现在我意识到有一种比直接从Python启动、停止和重新启动守护进程更好的方法:使用OS工具。

例如,对于Linux,我不做python myapp start和python myapp stop,而是这样启动应用程序:

screen -S myapp python myapp.py    
# CTRL+A, D to detach

或者screen -dmS myapp python myapp.py在一个命令中启动和卸载它。

然后:

screen -r myapp

重新连接到这个终端。进入终端后,可以使用CTRL+C来停止它。