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

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

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


当前回答

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

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

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

其他回答

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

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

它还包含一个PidFile类。

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

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

这里是文档。

当前的解决方案

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

历史的答案

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

用Python创建守护进程最简单的方法是使用Twisted事件驱动框架。它为您处理守护进程所需的所有东西。它使用反应堆模式来处理并发请求。

可能这不是对问题的直接回答,但systemd可以用于作为守护进程运行应用程序。这里有一个例子:

[Unit]
Description=Python daemon
After=syslog.target
After=network.target

[Service]
Type=simple
User=<run as user>
Group=<run as group group>
ExecStart=/usr/bin/python <python script home>/script.py

# Give the script some time to startup
TimeoutSec=300

[Install]
WantedBy=multi-user.target

我更喜欢这种方法,因为许多工作都是为您完成的,并且您的守护进程脚本的行为与系统的其他部分类似。

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

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

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