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

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

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


当前回答

因为python-daemon还不支持python3。我已经编写了PEP 3143的一个新实现:pep3143daemon

pep3143守护进程至少支持python 2.6、2.7和3.x

它还包含一个PidFile类。

该库仅依赖于标准库和六个模块。

它可以用作python-daemon的替代品。

这里是文档。

其他回答

恐怕@Dustin提到的守护模块对我不起作用。相反,我安装了python-daemon并使用以下代码:

# filename myDaemon.py
import sys
import daemon
sys.path.append('/home/ubuntu/samplemodule') # till __init__.py
from samplemodule import moduleclass 

with daemon.DaemonContext():
    moduleclass.do_running() # I have do_running() function and whatever I was doing in __main__() in module.py I copied in it.

跑步很容易

> python myDaemon.py

为了完整起见,这里是samplemodule的目录内容

>ls samplemodule
__init__.py __init__.pyc moduleclass.py

py的内容可以是

class moduleclass():
    ...

def do_running():
    m = moduleclass()
    # do whatever daemon is required to do.

注意python-daemon包,它可以开箱即用地解决daemon背后的许多问题。

它支持的其他特性(来自Debian包描述)包括:

将进程分离到自己的进程组中。 设置适合在chroot中运行的进程环境。 放弃suid和sgid权限。 关闭所有打开的文件描述符。 修改工作目录、uid、gid和umask。 设置适当的信号处理程序。 打开stdin、stdout和stderr的新文件描述符。 管理指定PID锁文件。 注册用于出口处理的清理函数。

当前的解决方案

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

历史的答案

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

80%的情况下,当人们说“守护进程”时,他们只想要一个服务器。因为这个问题在这一点上是完全不清楚的,所以很难说答案的可能范围是什么。既然有一个服务器就足够了,那就从那里开始吧。如果实际需要一个“守护进程”(这种情况很少见),请阅读nohup作为对服务器进行守护的一种方式。

在真正需要守护进程之前,只需编写一个简单的服务器。

再看看WSGI参考实现。

再看看简单HTTP服务器。

“还有其他需要考虑的事情吗?”是的。大概有一百万件事。什么协议?有多少请求?为每个请求服务多长时间?他们多久来一次?您会使用专用的流程吗?线程?子流程?编写一个守护进程是一项大工作。

在成为一个行为良好的守护进程时,有许多精细的事情需要注意:

prevent core dumps (many daemons run as root, and core dumps can contain sensitive information) behave correctly inside a chroot gaol set UID, GID, working directory, umask, and other process parameters appropriately for the use case relinquish elevated suid, sgid privileges close all open file descriptors, with exclusions depending on the use case behave correctly if started inside an already-detached context, such as init, inetd, etc. set up signal handlers for sensible daemon behaviour, but also with specific handlers determined by the use case redirect the standard streams stdin, stdout, stderr since a daemon process no longer has a controlling terminal handle a PID file as a cooperative advisory lock, which is a whole can of worms in itself with many contradictory but valid ways to behave allow proper cleanup when the process is terminated actually become a daemon process without leading to zombies

其中一些是标准的,如Unix规范文献(已故的W. Richard Stevens所著的《Unix环境中的高级编程》,Addison-Wesley, 1992年)中所述。其他的,如流重定向和PID文件处理,是大多数守护进程用户所期望的常规行为,但不太标准化。

所有这些都包含在PEP 3143“标准守护进程库”规范中。Python -daemon参考实现适用于Python 2.7或更高版本,以及Python 3.2或更高版本。