如何运行长期(无限)Python进程?
我最近开始尝试使用Python进行Web开发。到目前为止,我在将Apache与mod_wsgi结合使用以及针对python 2.7的Django
Web框架方面取得了一些成功。但是,我遇到了一些问题,这些问题导致流程不断运行,更新信息等。
我编写了一个脚本,称为“
daemonManager.py”,该脚本可以启动和停止所有或单个python更新循环(我应该将它们称为Daemon吗?)。它通过分叉,然后为应运行的特定功能加载模块并启动无限循环来做到这一点。它保存一个PID文件/var/run
以跟踪过程。到现在为止还挺好。我遇到的问题是:
-
有时,其中一个过程将退出。我
ps
在早上检查,过程刚刚结束。没有记录任何错误(我正在使用该logging
模块),并且涵盖了我能想到的所有异常并记录了它们。我也不认为这些退出过程与我的代码有任何关系,因为我所有的过程都运行完全不同的代码并以非常相似的间隔退出。我当然是错的。在运行数天/数周后,Python进程死掉是正常的吗?我该如何解决这个问题?我是否应该编写另一个守护程序来定期检查其他守护程序是否仍在运行?如果该守护程序停止,该怎么办?我对如何处理这个不知所措。 -
我如何以编程方式知道某个进程是否仍在运行?我将PID文件保存在其中,
/var/run
并检查PID文件是否存在,以确定进程是否正在运行。但是,如果该过程只是死于意外原因,则PID文件将保留。因此,每次进程崩溃(每周几次)时,我都必须删除这些文件,这会破坏目的。我想我可以检查一个进程是否正在文件中的PID上运行,但是如果另一个进程已经启动并被分配了死进程的PID怎么办?我的守护程序会认为该进程运行良好,即使它已经死了很长时间。再次我无所适从。
关于如何 最好地 运行无限Python进程的任何有用的答案,希望也能阐明上述问题,我会接受
我在Ubuntu机器上使用Apache 2.2.14。
我的Python版本是2.7.2
-
首先,我将指出这是管理长时间运行的过程(LRP)的 一种 方法-实际上并不是任何事情。
以我的经验,最好的产品来自专注于您要处理的特定问题,同时将支持技术委托给其他图书馆。在这种情况下,我指的是后台进程(双叉技术),监视和日志重定向的行为。
我最喜欢的解决方案是http://supervisord.org/
使用像supervisor这样的系统,您基本上编写了一个常规的python脚本,该脚本在陷入“无限”循环的同时执行任务。
#!/usr/bin/python import sys import time def main_loop(): while 1: # do your stuff... time.sleep(0.1) if __name__ == '__main__': try: main_loop() except KeyboardInterrupt: print >> sys.stderr, '\nExiting by user request.\n' sys.exit(0)
这样编写脚本可以简化开发和调试过程(您可以在终端中轻松启动/停止它,并在事件发生时观察日志输出)。投入生产时,您只需定义一个调用脚本的主管配置(以下是定义“程序”的
完整 示例,其中许多是可选的:http : //supervisord.org/configuration.html#program -x-section-
example)。监事有 一堆 的配置选项,所以我不会一一列举,但我会说,它专门解决你所描述的问题:
- 后台/守护进程
- PID跟踪(可以配置为在进程意外终止时重新启动该进程)
- 正常登录脚本(如果使用日志记录模块而不是打印,则使用流处理程序,而不是打印),但让主管为您重定向到文件。