5

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

我正在考虑实现一个基本上可以做到的while循环

ps -ef | grep process name

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

4

6 回答 6

5

为什么要自己实现?像daemon或 Debian's这样的现有实用程序start-stop-daemon更有可能解决有关运行长期服务器进程的其他难题。

无论如何,当您启动服务时,将其 pid 放入/var/run/<name>.pid,然后让您的ps命令只查找该进程 ID,并检查它是否是正确的进程。在 Linux 上,您可以简单地/proc/<pid>/exe查看它是否指向正确的可执行文件。

于 2009-05-23T18:50:19.750 回答
3

请不要重新发明init。您的操作系统具有执行此操作的功能,几乎不需要系统资源,并且肯定会比您可以复制的任何东西更好、更可靠地做到这一点。

经典 Linux 有 /etc/inittab

Ubuntu 有 /etc/event.d(新贵)

OS X 已推出

Solaris 有 smf

于 2009-05-23T19:22:54.020 回答
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()
于 2009-05-23T20:55:14.270 回答
1

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

于 2011-10-07T01:08:17.807 回答
0

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

于 2009-05-23T18:31:42.430 回答
0

我会走命令行路线(这更容易恕我直言),只要您每隔一两秒检查一次,与任何不到 10 年的系统上的可用处理相比,资源使用量应该是无穷小的。

于 2009-05-23T18:42:11.573 回答