【发布时间】:2012-01-30 22:10:52
【问题描述】:
我最近开始尝试使用 Python 进行 Web 开发。到目前为止,我已经在使用 Apache 与 mod_wsgi 和 Python 2.7 的 Django Web 框架方面取得了一些成功。但是,我遇到了一些问题,比如让进程不断运行、更新信息等。
我编写了一个脚本,我称之为“daemonManager.py”,它可以启动和停止所有或单个 python 更新循环(我应该称它们为守护进程吗?)。它通过分叉,然后为它应该运行的特定功能加载模块并启动无限循环来做到这一点。它在/var/run 中保存一个PID 文件以跟踪进程。到目前为止,一切都很好。我遇到的问题是:
有时其中一个进程会退出。我早上检查
ps,这个过程就结束了。没有记录错误(我正在使用logging模块),并且我涵盖了我能想到的所有异常并记录它们。此外,我认为这些退出进程与我的代码没有任何关系,因为我所有的进程都运行完全不同的代码并以非常相似的间隔退出。我当然可能是错的。 Python 进程在运行数天/数周后就死机是否正常?我应该如何解决这个问题?我是否应该编写另一个守护程序来定期检查其他守护程序是否仍在运行?如果那个守护进程停止了怎么办?我不知道如何处理这个问题。如何以编程方式知道进程是否仍在运行?我将 PID 文件保存在
/var/run中并检查 PID 文件是否存在以确定进程是否正在运行。但如果进程因意外原因而死,PID 文件将保留。因此,每次进程崩溃(每周几次)时,我都必须删除这些文件,这有点违背了目的。我想我可以检查一个进程是否在文件中的 PID 上运行,但是如果另一个进程已经启动并被分配了死进程的 PID 怎么办?我的守护进程会认为该进程运行良好,即使它早已死亡。再次,我不知道如何处理这个问题。
关于如何最好运行无限 Python 进程的任何有用答案,希望也能对上述问题有所了解,我会接受
我在 Ubuntu 机器上使用 Apache 2.2.14。
我的 Python 版本是 2.7.2
【问题讨论】:
-
如果您添加一些代码示例来显示正在崩溃的守护程序的代码,我们或许能够解决具体问题。首先,我会从您的脚本中删除所有处理分叉、监控、重定向等的代码。
-
您能否澄清您是从在 mod_wsgi 下运行的 WSGI 应用程序还是单独分叉这些守护进程。您不应该从在 mod_wsgi 下运行的应用程序创建此类进程。
-
听起来这里正在进行大量宣传。我的意思是,这是一个很好的问题,针对特定技术给出了答案,给出了另一个答案,其中再次回答“我也最终使用”了另一种(竞争性?)技术......
-
我不关注。这个问题有162个观点,这到底是一种什么样的宣传。我可以向你保证,我对 Forever 印象深刻,可以在下面的评论中推荐它
标签: python apache daemon infinite-loop