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