如何运行长期(无限)Python进程?

Hub*_*bro 29 python apache daemon infinite-loop

我最近开始尝试使用Python进行Web开发.到目前为止,我已经使用Apache与mod_wsgi和用于Python 2.7的Django Web框架取得了一些成功.但是,我遇到了一些问题,即流程不断运行,更新信息等等.

我编写了一个脚本,我称之为"daemonManager.py",可以启动和停止所有或单个python更新循环(我应该称之为守护进程吗?).它通过分叉,然后为应该运行的特定函数加载模块并启动无限循环来实现.它会保存PID文件/var/run以跟踪进程.到现在为止还挺好.我遇到的问题是:

  • 偶尔会有一个进程退出.我ps早上检查,过程刚刚结束.没有记录错误(我正在使用该logging模块),我正在报道我能想到的每个异常并记录它们.此外,我不认为这些退出过程与我的代码有任何关系,因为我的所有进程都运行完全不同的代码并以非常相似的间隔退出.我当然错了.Python进程在运行数天/数周后死亡是否正常?我该如何解决这个问题?我应该编写另一个守护进程来定期检查其他守护进程是否仍在运行吗?如果守护进程停止怎么办?我对如何处理这个问题感到很茫然.

  • 如何以编程方式知道进程是否仍在运行?我正在保存PID文件/var/run并检查PID文件是否在那里以确定进程是否正在运行.但是如果进程刚刚因意外原因而死,则PID文件将保留.因此,每次进程崩溃(每周几次)时,我都必须删除这些文件,这会破坏目的.我想我可以检查一个进程是否正在文件中的PID上运行,但如果另一个进程已启动并被分配了死进程的PID怎么办?我的守护进程会认为这个进程运行正常,即使它已经很久了.我再次对如何应对这种情况感到茫然.

关于如何最好地运行无限Python进程的任何有用的答案,希望也能解释上述问题,我会接受


我在Ubuntu机器上使用Apache 2.2.14.
我的Python版本是2.7.2

Owe*_*son 27

我将通过声明这是管理长时间运行流程(LRP)的一种方式来打开- 事实并非如此.

根据我的经验,最好的产品来自于专注于您正在处理的特定问题,同时将支持技术委托给其他图书馆.在这种情况下,我指的是后台进程(双叉的艺术),监视和日志重定向的行为.

我最喜欢的解决方案是http://supervisord.org/

使用像supervisord这样的系统,你基本上可以编写一个传统的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)
Run Code Online (Sandbox Code Playgroud)

以这种方式编写脚本使得开发和调试变得简单方便(您可以在终端中轻松启动/停止它,在事件展开时观察日志输出).当投入生产时,您只需定义一个调用脚本的超级用户配置(这里是定义"程序" 的完整示例,其中大部分是可选的:http://supervisord.org/configuration.html#program -x-section-example).

监事有一堆的配置选项,所以我不会一一列举,但我会说,它专门解决你所描述的问题:

  • Backgrounding/Daemonizing
  • PID跟踪(可配置为在意外终止时重启进程)
  • 通常在您的脚本中记录(流处理程序,如果使用日志记录模块而不是打印),但让管理员重定向到您的文件.

  • 手动退出脚本后,Supervisor 会重新启动脚本吗? (2认同)