使用Python不断监视程序/进程

时间:2012-11-28 05:34:59

标签: python scheduling daemon cron-task

我正在尝试不断监视一个基本上是Python程序的进程。如果程序停止,那么我必须再次启动程序。我正在使用另一个Python程序。

例如,假设我必须不断运行名为run_constantly.py的流程。我最初手动运行该程序,将其进程ID写入文件“PID”(位置输出/ PROCESSID / PID)。

现在我运行另一个具有以下代码的程序来监视来自Linux环境的程序run_constantly.py

def Monitor_Periodic_Process():

    TIMER_RUNIN = 1800
    foo = imp.load_source("Run_Module","run_constantly.py")
    PROGRAM_TO_MONITOR = ['run_constantly.py','out/PROCESSID/PID']
    while(1):
        # call the function checkPID to see if the program is running or not
        res = checkPID(PROGRAM_TO_MONITOR)
        # if res is 0 then program is not running so schedule it
        if (res == 0):
            date_time = datetime.now()
            scheduler.add_cron_job(foo.Run_Module, year=date_time.year, day=date_time.day, month=date_time.month, hour=date_time.hour, minute=date_time.minute+2)
            scheduler.start()
            scheduler.get_jobs()
            time.sleep(TIMER_NOT_RUNIN)
            continue
        else:
            #the process is running sleep and then monitor again
            time.sleep(TIMER_RUNIN)
            continue

我这里没有包含checkPID()功能。 checkPID()基本上检查进程ID是否仍然存在(即程序是否仍在运行),如果它不存在,则返回0。在上面的程序中,我检查是否res == 0,如果是,那么我使用Python的调度程序来安排程序。但是,我目前面临的主要问题是,一旦我使用{{run_constantly.py安排run_constantly.py,此程序的进程ID和scheduler.add_cron_job()程序将变为相同 1}}功能。因此,如果程序run_constantly.py崩溃,则以下程序仍然认为run_constantly.py正在运行(因为两个进程ID都相同),因此继续进入else循环以进入休眠状态并再次监视。 / p>

有人能告诉我如何解决这个问题吗?是否有一种简单的方法可以持续监控程序并在程序崩溃时重新安排程序?

4 个答案:

答案 0 :(得分:8)

有很多程序可以做到这一点。

在Ubuntu上有upstart(默认安装)

很多人喜欢http://supervisord.org/

@nathan

提到的

monit

如果您正在寻找一个python替代品,那么刚刚发布的名为circus的库看起来很有趣。

几乎每个Linux发行版都可能内置了其中一个。

这个选择实际上只取决于你更喜欢哪一个,但是使用其中一个比自己写的要好得多。

希望有所帮助

答案 1 :(得分:2)

如果您愿意直接从python控制受监控程序而不是使用cron,请查看subprocess module

The subprocess module allows you to spawn new processes,
connect to their input/output/error pipes, and obtain their return codes.

检查SO上的track process status with python等示例以获取示例和参考。

答案 2 :(得分:1)

你可以使用monit http://mmonit.com/monit/

它监视进程并重新启动它们(和其他东西。)

答案 3 :(得分:0)

我想我会添加一个更通用的解决方案,我个人也一直在使用这种解决方案。

它的名字是Immortal(来源在https://github.com/immortal/immortal

要让它监视并在程序停止时立即重新启动程序,只需运行以下命令:

immortal <command>

所以在你的情况下,我会像这样运行 run_constantly.py

immortal python run_constantly.py

命令 ps aux | grep run_constantly.py 应该返回 2 个进程 ID,一个用于 Immortal 命令,一个用于单独的命令 Immortal 启动(只是常规命令。只要 Immortal 进程正在运行,run_constantly.py 将继续运行。