在谷歌上搜索显示x2个代码片段。第一个结果是这个代码配方,它有很多文档和解释,以及下面一些有用的讨论。
然而,另一个代码示例虽然不包含这么多文档,但包含了传递启动、停止和重启等命令的示例代码。它还创建了一个PID文件,可以方便地检查守护进程是否已经在运行等。
这些示例都解释了如何创建守护进程。还有其他需要考虑的事情吗?一个样本比另一个更好吗?为什么?
在谷歌上搜索显示x2个代码片段。第一个结果是这个代码配方,它有很多文档和解释,以及下面一些有用的讨论。
然而,另一个代码示例虽然不包含这么多文档,但包含了传递启动、停止和重启等命令的示例代码。它还创建了一个PID文件,可以方便地检查守护进程是否已经在运行等。
这些示例都解释了如何创建守护进程。还有其他需要考虑的事情吗?一个样本比另一个更好吗?为什么?
当前回答
因为python-daemon还不支持python3。我已经编写了PEP 3143的一个新实现:pep3143daemon
pep3143守护进程至少支持python 2.6、2.7和3.x
它还包含一个PidFile类。
该库仅依赖于标准库和六个模块。
它可以用作python-daemon的替代品。
这里是文档。
其他回答
另一种方法——创建一个正常的、非守护的Python程序,然后使用监控器在外部对其进行守护。这可以省去很多麻烦,并且是*nix和语言可移植的。
这是我的基本'Howdy World' Python守护进程,当我开发一个新的守护进程应用程序时,我开始使用它。
#!/usr/bin/python
import time
from daemon import runner
class App():
def __init__(self):
self.stdin_path = '/dev/null'
self.stdout_path = '/dev/tty'
self.stderr_path = '/dev/tty'
self.pidfile_path = '/tmp/foo.pid'
self.pidfile_timeout = 5
def run(self):
while True:
print("Howdy! Gig'em! Whoop!")
time.sleep(10)
app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()
注意,您将需要python-daemon库。你可以通过以下方法安装:
pip install python-daemon
然后用。/howdy.py start开始,用。/howdy.py stop结束。
经过几年的努力和多次尝试(我尝试了这里给出的所有答案,但最后都有一些小缺点),现在我意识到有一种比直接从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来停止它。
YapDi是一个python包。它可用于从脚本内部将python脚本转换为守护进程模式。
注意python-daemon包,它可以开箱即用地解决daemon背后的许多问题。
它支持的其他特性(来自Debian包描述)包括:
将进程分离到自己的进程组中。 设置适合在chroot中运行的进程环境。 放弃suid和sgid权限。 关闭所有打开的文件描述符。 修改工作目录、uid、gid和umask。 设置适当的信号处理程序。 打开stdin、stdout和stderr的新文件描述符。 管理指定PID锁文件。 注册用于出口处理的清理函数。