如何监视Python进程并在其死亡时重新启动?
我有一个正在运行的程序,它监听队列(它不是多线程的,所以我想运行它的几个实例)。我已经尽力捕捉错误,但是如果应用程序由于错误或错误的传入数据而崩溃,我希望能够重新启动Python应用程序(在我记录stacktrace之后),使其继续工作 我觉得对于运行基于python的服务的人来说,这可能是一个常见的问题,所以我想问一下,但我正在考虑编写一些代码来执行如何监视Python进程并在其死亡时重新启动?,python,linux,Python,Linux,我有一个正在运行的程序,它监听队列(它不是多线程的,所以我想运行它的几个实例)。我已经尽力捕捉错误,但是如果应用程序由于错误或错误的传入数据而崩溃,我希望能够重新启动Python应用程序(在我记录stacktrace之后),使其继续工作 我觉得对于运行基于python的服务的人来说,这可能是一个常见的问题,所以我想问一下,但我正在考虑编写一些代码来执行ps-ef,并计算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...
试着用谷歌搜索“看门狗”,这是这类任务通常被称为的。用谷歌搜索“看门狗”,这是这类任务通常被称为的。虽然这个链接可能会回答这个问题,但最好在这里包括答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能会无效。很好,我提供了一个我自己使用的简单配置部分。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面更改,只有链接的答案可能会变得无效。好的一点,我包括了一个我自己使用的简单配置部分。