8

我正在尝试不断监视一个基本上是 Python 程序的进程。如果程序停止,那么我必须重新启动程序。我正在使用另一个 Python 程序来执行此操作。

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

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

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. 在上面的程序中,我检查 if res == 0,如果是,那么我使用 Python 的调度程序来调度程序。但是,我目前面临的主要问题是,一旦我安排使用该功能,该程序的进程 ID 和该run_constantly.py程序的进程 ID就会相同。所以如果程序崩溃了,下面的程序仍然认为它正在运行(因为两个进程ID相同),因此继续进入else循环休眠并再次监控。run_constantly.pyscheduler.add_cron_job()run_constantly.pyrun_constantly.py

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

4

4 回答 4

10

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

在 Ubuntu 上有暴发户(默认安装)

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

@nathan提到的监控

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

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

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

希望有帮助

于 2012-11-28T05:58:59.423 回答
2

如果您愿意直接从 python 而不是使用 cron 来控制被监控的程序,请查看subprocess模块

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

检查示例,例如在 SO 上使用 python 跟踪进程状态以获取示例和参考。

于 2012-11-28T06:22:05.277 回答
1

您可以只使用 monit http://mmonit.com/monit/

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

于 2012-11-28T05:41:16.697 回答
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它将保持运行。

于 2021-03-11T07:36:17.347 回答