我需要检测程序何时崩溃或没有使用 python 运行并重新启动它。我需要一种不一定依赖于作为父进程的 python 模块的方法。
我正在考虑实现一个基本上可以做到的while循环
ps -ef | grep process name
当找不到该进程时,它会启动另一个进程。也许这不是最有效的方法。我是 python 新手,所以可能已经有一个 python 模块可以做到这一点。
为什么要自己实现?像daemon或 Debian's这样的现有实用程序start-stop-daemon
更有可能解决有关运行长期服务器进程的其他难题。
无论如何,当您启动服务时,将其 pid 放入/var/run/<name>.pid
,然后让您的ps
命令只查找该进程 ID,并检查它是否是正确的进程。在 Linux 上,您可以简单地/proc/<pid>/exe
查看它是否指向正确的可执行文件。
请不要重新发明init。您的操作系统具有执行此操作的功能,几乎不需要系统资源,并且肯定会比您可以复制的任何东西更好、更可靠地做到这一点。
经典 Linux 有 /etc/inittab
Ubuntu 有 /etc/event.d(新贵)
OS X 已推出
Solaris 有 smf
以下代码在给定时间间隔内检查给定进程,并重新启动它。
#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()
我自己没有尝试过,但是有一个Python System Information模块可以用来查找进程并获取有关它们的信息。AFAIR 有一个ProcessTable
类可以用来检查正在运行的进程,但它似乎没有很好的文档记录......
我会走命令行路线(这更容易恕我直言),只要您每隔一两秒检查一次,与任何不到 10 年的系统上的可用处理相比,资源使用量应该是无穷小的。