我需要检测程序崩溃或没有使用python运行并重新启动它。我需要一个不一定依赖python模块作为父进程的方法。
我正在考虑实现一个基本上执行
的while循环ps -ef | grep process name
当找不到该过程时,它会启动另一个过程。也许这不是最有效的方法。我是python的新手,所以可能有一个python模块已经做到了。
答案 0 :(得分:5)
为什么要自己实施?像daemon或Debian start-stop-daemon
这样的现有实用程序更有可能在运行长期服务器进程时获得其他困难的东西。
无论如何,当你启动服务时,将它的pid放在/var/run/<name>.pid
中然后让你的ps
命令只查找该进程ID,并检查它是否是正确的进程。在Linux上,您只需查看/proc/<pid>/exe
即可检查它是否指向正确的可执行文件。
答案 1 :(得分:3)
请不要重新发明init。您的操作系统具有执行此操作的功能,几乎不需要系统资源,并且肯定会比您可以重现的任何内容更好,更可靠。
Classic Linux有/ etc / inittab
Ubuntu有/etc/event.d(upstart)
OS X已启动
Solaris有smf
答案 2 :(得分:1)
以下代码检查给定时间间隔内的给定进程,然后重新启动它。
#Restarts a given process if it is finished.
#Compatible with Python 2.5, tested on Windows XP.
import threading
import time
import subprocess
class ProcessChecker(threading.Thread):
def __init__(self, process_path, check_interval):
threading.Thread.__init__(self)
self.process_path = process_path
self.check_interval = check_interval
def run (self):
while(1):
time.sleep(self.check_interval)
if self.is_ok():
self.make_sure_process_is_running()
def is_ok(self):
ok = True
#do the database locks, client data corruption check here,
#and return true/false
return ok
def make_sure_process_is_running(self):
#This call is blocking, it will wait for the
#other sub process to be finished.
retval = subprocess.call(self.process_path)
def main():
process_path = "notepad.exe"
check_interval = 1 #In seconds
pm = ProcessChecker(process_path, check_interval)
pm.start()
print "Checker started..."
if __name__ == "__main__":
main()
答案 3 :(得分:1)
答案 4 :(得分:0)
我自己没有尝试过,但有一个Python System Information模块可用于查找进程并获取有关它们的信息。 AFAIR有一个ProcessTable
类,可用于检查正在运行的进程,但它似乎没有很好地记录......
答案 5 :(得分:0)
我会去命令行路线(只是简单的imho),只要你每隔一两秒检查一次资源使用量与10岁以下任何系统的可用处理相比应该是无限的。