Планирование заданий с использованием 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]