使用python apscheduler调度作业

时间:2012-05-14 08:35:32

标签: python process cron monitoring scheduling

我必须不断监视进程,并使用进程ID来监视进程。我编写了一个程序,一旦进程停止就发送一封电子邮件,以便我手动重新安排它,但我常常忘记重新安排进程(基本上是另一个python程序)。然后我遇到了apscheduler模块,并使用cron样式调度(http://packages.python.org/APScheduler/cronschedule.html)一旦它停止就产生一个进程。现在,我可以在进程的PID被杀死后生成进程,但是当我使用apscheduler生成它时,我无法获得新调度进程的进程ID(PID);因此,我无法监控该过程。是否在apscheduler中有一个函数来获取计划进程的进程ID?

2 个答案:

答案 0 :(得分:3)

为什么不让你的程序报告pid本身,而不是依靠APSchedule返回pid。守护进程很常见,pidfiles是一个已知位置的文件,只包含正在运行的进程的pid。只需将您的main函数包装成以下内容:

import os

try:
    with open("/tmp/myproc.pid") as pidfile:
        pidfile.write(str(os.getpid()))
    main()
finally:
    os.remove("/tmp/myproc.pid")

现在,只要您想要监控您的流程,您就可以首先检查pid文件是否存在,如果存在,则检索流程的pid以进行进一步监控。这样做的好处是可以独立于cron的特定实现,如果你想编写更多本地与程序交互的程序,将来会更容易。

答案 1 :(得分:0)

是的,您可以使用 simple-scheduler 的进程 ID 监控您的作业。

from time import sleep, ctime, time
from simple_scheduler.recurring import recurring_scheduler

def wait_t_secs(t):
    began_at = ctime(time())
    sleep(t)
    print(f"I waited {t} seconds. [From: {began_at} to {ctime(time())}]")

recurring_scheduler.add_job(target=wait_t_secs,
                            kwargs={"t":5},
                            period_in_seconds=5,
                            job_name="wait_t_secs")
recurring_scheduler.run()
recurring_scheduler.job_summary()

输出:

    Scheduled jobs:
wait_t_secs [recurring | 5-second(s)] running in 24060

I waited 5 seconds. [From: Fri Jul 23 16:54:39 2021 to Fri Jul 23 16:54:44 2021]
I waited 5 seconds. [From: Fri Jul 23 16:54:44 2021 to Fri Jul 23 16:54:49 2021]