如何监控Python进程并在其崩溃时重启?

1 投票
3 回答
1892 浏览
提问于 2025-04-18 05:43

我有一个程序,它会监听一个队列(这个程序不是多线程的,所以我想运行几个实例)。我尽量捕捉错误,但如果因为错误或接收到坏数据导致程序崩溃,我希望能够重新启动这个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。你可以在 这里 了解更多关于配置的内容。

撰写回答