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

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

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


当前回答

可能这不是对问题的直接回答,但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

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

其他回答

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

在这儿。

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

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

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

再看看WSGI参考实现。

再看看简单HTTP服务器。

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

另一种方法——创建一个正常的、非守护的Python程序,然后使用监控器在外部对其进行守护。这可以省去很多麻烦,并且是*nix和语言可移植的。

当前的解决方案

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

历史的答案

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

这是我的基本'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结束。