在谷歌上搜索显示x2个代码片段。第一个结果是这个代码配方,它有很多文档和解释,以及下面一些有用的讨论。
然而,另一个代码示例虽然不包含这么多文档,但包含了传递启动、停止和重启等命令的示例代码。它还创建了一个PID文件,可以方便地检查守护进程是否已经在运行等。
这些示例都解释了如何创建守护进程。还有其他需要考虑的事情吗?一个样本比另一个更好吗?为什么?
在谷歌上搜索显示x2个代码片段。第一个结果是这个代码配方,它有很多文档和解释,以及下面一些有用的讨论。
然而,另一个代码示例虽然不包含这么多文档,但包含了传递启动、停止和重启等命令的示例代码。它还创建了一个PID文件,可以方便地检查守护进程是否已经在运行等。
这些示例都解释了如何创建守护进程。还有其他需要考虑的事情吗?一个样本比另一个更好吗?为什么?
当前回答
这个函数将应用程序转换为守护进程:
import sys
import os
def daemonize():
try:
pid = os.fork()
if pid > 0:
# exit first parent
sys.exit(0)
except OSError as err:
sys.stderr.write('_Fork #1 failed: {0}\n'.format(err))
sys.exit(1)
# decouple from parent environment
os.chdir('/')
os.setsid()
os.umask(0)
# do second fork
try:
pid = os.fork()
if pid > 0:
# exit from second parent
sys.exit(0)
except OSError as err:
sys.stderr.write('_Fork #2 failed: {0}\n'.format(err))
sys.exit(1)
# redirect standard file descriptors
sys.stdout.flush()
sys.stderr.flush()
si = open(os.devnull, 'r')
so = open(os.devnull, 'w')
se = open(os.devnull, 'w')
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
其他回答
这是我的基本'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结束。
YapDi是一个python包。它可用于从脚本内部将python脚本转换为守护进程模式。
恐怕@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中进行daemonization时,还有一件需要考虑的事情:
如果您正在使用python日志记录,并且希望在守护进程完成后继续使用它,请确保在处理程序(特别是文件处理程序)上调用close()。
如果您不这样做,处理程序仍然可以认为它有文件打开,并且您的消息将简单地消失-换句话说,确保记录器知道它的文件是关闭的!
这假设当你守护进程时,你不加区别地关闭所有打开的文件描述符——相反,你可以尝试关闭除了日志文件以外的所有文件(但是关闭所有文件然后重新打开你想要的文件通常更简单)。
因为python-daemon还不支持python3。我已经编写了PEP 3143的一个新实现:pep3143daemon
pep3143守护进程至少支持python 2.6、2.7和3.x
它还包含一个PidFile类。
该库仅依赖于标准库和六个模块。
它可以用作python-daemon的替代品。
这里是文档。