Python中的自动重启系统

时间:2009-05-23 18:07:22

标签: python linux restart pid

我需要检测程序崩溃或没有使用python运行并重新启动它。我需要一个不一定依赖python模块作为父进程的方法。

我正在考虑实现一个基本上执行

的while循环
ps -ef | grep process name

当找不到该过程时,它会启动另一个过程。也许这不是最有效的方法。我是python的新手,所以可能有一个python模块已经做到了。

6 个答案:

答案 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)

也许你需要http://supervisord.org

答案 4 :(得分:0)

我自己没有尝试过,但有一个Python System Information模块可用于查找进程并获取有关它们的信息。 AFAIR有一个ProcessTable类,可用于检查正在运行的进程,但它似乎没有很好地记录......

答案 5 :(得分:0)

我会去命令行路线(只是简单的imho),只要你每隔一两秒检查一次资源使用量与10岁以下任何系统的可用处理相比应该是无限的。