我是新来的守护进程,所以抱歉,如果这是一个新问题。
在其他几个答案(例如,this question)中,人们建议应该使用python-daemon包,因为它完全实现了PEP 3143标准。
不幸的是,python守护进程是a bit light on documentation(或者更可能我对知识/经验有点了解。。。)我想我可能遗漏了一些基本的东西。我要做的是:
我有以下资料:
import daemon
logfile = open('daemon.log', 'w')
context = daemon.DaemonContext(stdout = logfile, stderr = logfile)
context.open()
with context:
do_something_1()
do_something_2()
问题:如何使用python后台程序设置后台程序,如何启动和停止它?
旁注:
我基本上是在胡乱猜测这里应该如何使用.open()
方法,或者是否应该使用.open()
——在这一点上,文档并不是很清楚。不管我是否包括在内,同样的事情似乎也会发生。
那么,现在我该怎么办?当我尝试运行此文件时,例如:
python startConsumerDaemons.py
它似乎运行do_something_1()
,但不是第二个。而且,它似乎将程序附加到终端窗口。也就是说,stdout没有被重定向,当我关闭终端窗口时,进程被终止。所以,我很确定我在这里做错了什么。。。我应该做些什么呢?
最后,在运行守护进程之后,如何停止/重新启动它(例如,如果我更改了底层代码)?
正如您在'with' statement documentation中所看到的,it语句确实执行了一些与我们的目的相关的“魔术”。具体来说:
这是什么意思?如果仔细查看the PEP in question,它也可以作为python守护进程文档(而且确实可以得到很大改进),您将看到它实现了
__enter__()
和__exit__()
:换句话说,不需要open(),PEP中给出的示例(尽管解释不正确)可以正常工作。虽然with语句确实有意义,但它不保留任何循环,一旦到达其作用域的末尾,它将调用exit(),这在python守护进程中是close()的意思。因此,你需要放置一段时间的真实或你认为无限循环。
关于你的第二个剧本不起作用的表现,我真的不能告诉你,我很惊讶第一个已经起作用了。如果守护进程正在停止,脚本肯定有问题,可以检查consumerDaemonLogFile。(另请注意,您键入了'sderr'-->;'stderr')
此外,您可以在PEP中看到,如果未指定,工作目录属性默认为“/”。如果在脚本中使用相对路径,这可能是问题的根源。
最后,关于最后一个问题,您可以很容易地杀死正在查找其PID的守护进程:
并发送一个SIGTERM:
gromain提供的答案确实提供了一种更方便的方法来启动和停止它,使用“daemon.runner()”,但是设置起来要复杂得多。
这就是我所拥有的,对我有用。它还有一个sysv init脚本。Repo is at GitHub,我还有a brief blog post链接到我发现的其他可能的解决方案。
只能有一个守护进程正在运行:它与大多数其他Linux守护进程一样,由PID锁文件管理。阻止它,做
要查看它是否正在运行:
使用PID file子模块,可以自动管理PID文件。当守护进程停止时,pidfile被清除。请查看init脚本的链接GitHub repo。
以下是Python守护程序代码:
为了完整起见,这里是init脚本。请注意,“kill”实际上只是发送POSIX信号的一种方法——请参见信号手册页(7)以了解概述。python守护进程上下文将捕获该信号,干净地结束进程关闭文件描述符,并自动删除PID文件。所以,这真的是一个彻底的终结。
您可以编写代码来捕获SIGUSR1或类似的东西,以便重新加载守护程序配置。编写Python停止守护进程没有任何好处。
一个完整的例子是available here。
您应该能够更好地理解python守护进程的内部工作原理。
此外,提供的代码还提供了一个init脚本示例,用于简单地启动/停止守护进程。但是,您可以通过使用参数stop再次调用原始函数来启动/停止它:
相关问题 更多 >
编程相关推荐