Планирование заданий с использованием Python Apscheduler

Я должен непрерывно контролировать процесс, и я использую идентификатор процесса для мониторинга процесса. Я написал программу для отправки электронного письма после остановки процесса, чтобы я мог вручную перенести его, но часто я забываю перепланировать процесс (в основном, другая программа на python). Затем я наткнулся на модуль apscheduler и использовал расписание в стиле cron ( http://packages.python.org/APScheduler/cronschedule.html) для запуска процесса после его остановки. Теперь я могу порождать процесс после того, как PID процесса был убит, но когда я порождаю его с помощью apscheduler, я не могу получить идентификатор процесса (PID) недавно запланированного процесса; Следовательно, я не могу контролировать процесс. Есть ли в apscheduler функция для получения идентификатора запланированного процесса?

2 ответа

Решение

Вместо того, чтобы полагаться на APSchedule для возврата pid, почему бы вашей программе не сообщать о самом pid. Для демонов довольно часто иметь pid-файлы, которые представляют собой файлы в известном месте, которые просто содержат pid запущенного процесса. Просто оберните вашу основную функцию примерно так:

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, и в будущем это будет проще, если вы захотите писать больше программ, которые взаимодействуют с программой локально.

Да, вы можете отслеживать свои задания с помощью идентификаторов процессов с помощью simple-scheduler.

      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]
Другие вопросы по тегам