如何监视python进程并重新启动它是否会死?

时间:2014-05-07 19:16:30

标签: python linux

我有一个正在运行的程序,它正在侦听队列(它不是多线程的,所以我想运行它的几个实例)。我已经尽力捕获错误,但是如果应用程序由于错误或错误的传入数据而崩溃,我希望能够重新生成python应用程序(在我记录堆栈跟踪之后),以便它继续工作。

我觉得这对于运行基于python的服务的人来说可能是一个常见问题,所以我想我会问,但我正在考虑编写一些代码来执行ps -ef并计算python名称的实例程序(如果小于一个阈值,那么我会让程序重新启动它)。

在我构建之前,我想知道是否有更好的方法或现有的工具/模块可以做到这一点?

谢谢!

3 个答案:

答案 0 :(得分:2)

结帐supervisord。我经常使用它来启动,监控所有类型的东西。

以下是我如何设置它以在我的服务器上启动wsgi应用程序:

[program:quizzes]
directory = /var/www/quizzes.seasources.net
command = /home/jaime/code/virtualenv/quizzes/bin/uwsgi uwsgi.ini
process_name = quizzes
autostart = true
startsecs = 5
user = www-data
redirect_stderr = true
stdout_logfile = /var/www/quizzes.seasources.net/logs/supervisor-console.log
environment = PYTHON_EGG_CACHE=/tmp/python-eggs

配置文件格式易于理解,甚至可以将stdout / stderr记录到文件中。在它上面的/var/www/quizzes.seasources.net/logs/supervisor-console.log您可以阅读有关配置here的更多信息。

答案 1 :(得分:2)

你可以使用主管。用Python编写的一个众所周知的是supervisord,最新的Python也是Circus,然后有Monit或daemontools,可能还有更多。

答案 2 :(得分:0)

如果您正在寻找更简单的东西,您可以使用子流程模块(默认的python)来启动和检查您的流程...... 基本版本如下所示:

# run.py

import subprocess, time

# add your listener processor call here
_PROCESS_ARGS = ['python','/path/to/listener.py']
_PROCESS_TOTAL = 10

process_list = []

# start the processes...
for i in range(_PROCESS_TOTAL):     
    process_list.append(subprocess.Popen(_PROCESS_ARGS))

while True:     
    for i in range(_PROCESS_TOTAL):         
        p = process_list[i]         
            if p.poll() != None: # check if process is running                      
                process_list[i] = subprocess.Popen(_PROCESS_ARGS) # if not, replace with new one
    time.sleep(1) # check only every second...