在Python中自动重启系统

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

我正在考虑实现一个while循环,实质上是这样

ps -ef | grep process name 

当这个过程没有被发现时,它又开始了。 也许这不是最有效的方法。 我是新来的python所以可能有一个python模块已经这样做。

为什么要自己实施? 像守护进程或Debian的start-stop-daemon这样的现有实用程序更有可能让其他困难的东西正确地运行长寿的服务器进程。

无论如何,当你启动这个服务时,把它的pid放在/var/run/<name>.pid ,然后让你的ps命令找到那个进程ID,并检查它是否是正确的进程。 在Linux上,你可以简单地看一下/proc/<pid>/exe来检查它是否指向正确的可执行文件。

请不要重新初始化。 您的操作系统具有这样的功能,几乎不需要任何系统资源,而且一定会做得更好,更可靠。

经典的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() 

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

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

只要你每隔一两秒钟检查一下资源使用情况应该是无限小的,而不是10年前的任何系统上可用的处理情况,那么我就去命令行路线(这只是简单的imho)。