如何监控Python进程并在其崩溃时重启?
我有一个程序,它会监听一个队列(这个程序不是多线程的,所以我想运行几个实例)。我尽量捕捉错误,但如果因为错误或接收到坏数据导致程序崩溃,我希望能够重新启动这个Python应用(在记录错误信息后),这样它就能继续工作。
我觉得这个问题可能是很多运行基于Python服务的人都会遇到的,所以我想问问。我在考虑写一些代码,使用ps -ef
命令来查看当前运行的Python程序实例数量(如果少于某个阈值,我就让程序重新启动它)。
在我动手之前,我想知道是否有更好的方法,或者有没有现成的工具或模块可以做到这一点?
3 个回答
1
如果你想要一个更简单的方法,可以使用 subprocess 模块(这是 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...
2
你可以使用一个管理工具。一个比较知名的用Python写的管理工具是supervisord,还有一个比较新的也是用Python写的叫Circus。此外,还有Monit和daemontools,可能还有很多其他的选择。
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
这个配置文件的格式很简单,容易理解,而且它还会把程序的输出和错误信息记录到一个文件里。上面提到的文件是 /var/www/quizzes.seasources.net/logs/supervisor-console.log。你可以在 这里 了解更多关于配置的内容。