如何监视Python进程并在其死亡时重新启动?

如何监视Python进程并在其死亡时重新启动?,python,linux,Python,Linux,我有一个正在运行的程序,它监听队列(它不是多线程的,所以我想运行它的几个实例)。我已经尽力捕捉错误,但是如果应用程序由于错误或错误的传入数据而崩溃,我希望能够重新启动Python应用程序(在我记录stacktrace之后),使其继续工作 我觉得对于运行基于python的服务的人来说,这可能是一个常见的问题,所以我想问一下,但我正在考虑编写一些代码来执行ps-ef,并计算python程序名称的实例(如果小于阈值,我会让程序重新启动它) 在我构建这个之前,我想知道是否有更好的方法或现有的工具/模块来

我有一个正在运行的程序,它监听队列(它不是多线程的,所以我想运行它的几个实例)。我已经尽力捕捉错误,但是如果应用程序由于错误或错误的传入数据而崩溃,我希望能够重新启动Python应用程序(在我记录stacktrace之后),使其继续工作

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

在我构建这个之前,我想知道是否有更好的方法或现有的工具/模块来实现这一点

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

下面是我如何设置它以在我的服务器上启动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,您可以阅读有关配置的更多信息。

签出。我经常使用它来启动、监控所有类型的东西

下面是我如何设置它以在我的服务器上启动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中,您可以阅读有关配置的更多信息。

您可以使用监督员。一个众所周知的是用Python编写的,一个更新的也是用Python编写的,还有Monit或daemontools,可能还有更多。

您可以使用一个管理器。一个众所周知的是用Python编写的,一个更新的也是用Python编写的,还有Monit或DAEMONTOOL,可能还有更多。

如果您想要更简单的东西,可以使用子流程模块(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...

如果您正在寻找更简单的方法,那么可以使用子流程模块(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...

试着用谷歌搜索“看门狗”,这是这类任务通常被称为的。用谷歌搜索“看门狗”,这是这类任务通常被称为的。虽然这个链接可能会回答这个问题,但最好在这里包括答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能会无效。很好,我提供了一个我自己使用的简单配置部分。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面更改,只有链接的答案可能会变得无效。好的一点,我包括了一个我自己使用的简单配置部分。