Подтвердить что ты не робот

APScheduler не запускается?

Я хотел бы запустить python script в течение ночи, и поэтому я думал об использовании APScheduler. Я запустил его в 1 утра следующей ночи, и он будет работать каждый вечер

Мой планировщик script выглядит так (scheduler.py):

from apscheduler.scheduler import Scheduler
from datetime import datetime, timedelta, time, date

def myScript():
    print "ok"

if __name__ == '__main__':
    sched = Scheduler()
    startDate = datetime.combine(date.today() + timedelta(days=1),time(1))
    sched.start()
    sched.add_interval_job(myScript, start_date = startDate, days=1)

В оболочке я делаю: python myScheduler.py & disown (Я запускаю его удаленно, поэтому я хочу запустить его в фоновом режиме и отрезать его. Сразу же после строки появляется число (PID), как и любой другой python script. Но когда я делаю ps -e | grep python, этого числа нет. Я пытался сделать kill -9 PID, и у меня появилось сообщение о том, что работа не существует.

Работает ли планировщик? Если да, как я могу остановить его? если нет, что я делаю неправильно?

4b9b3361

Ответ 1

вам нужно сохранить script в противном случае после sched.add_interval_job(myScript, start_date = startDate, days=1), script заканчивается и останавливается. добавьте

import time

while True:
    time.sleep(10)
sched.shutdown()

после, а затем планировщик все еще будет жив.

Ответ 2

Правильное решение было бы сказать планировщику не запускаться как демон:

sched = Scheduler()
sched.daemonic = False

или

sched = Scheduler()
sched.configure({'apscheduler.daemonic': False})

Ответ 3

вот мой путь:

from apscheduler.scheduler import Scheduler
def mainjob():
    print("It works!")

if __name__ == '__main__':
    sched = Scheduler()
    sched.start()
    sched.add_interval_job(mainjob,minutes=1)
    input("Press enter to exit.")
    sched.shutdown()

Ответ 4

Если вы используете версию 2.1.0, вы также можете передать standalone = True в конструктор планировщика. Подробные документы можно найти здесь

from apscheduler.scheduler import Scheduler
from datetime import datetime, timedelta, time, date

def myScript():
    print "ok"

if __name__ == '__main__':
    sched = Scheduler(standalone=True)
    startDate = datetime.combine(date.today() + timedelta(days=1),time(1))
    sched.add_interval_job(myScript, start_date = startDate, days=1)
    sched.start()

Ответ 5

У меня установлен apscheduler v3, и это то, что я бы сделал.

from apscheduler.schedulers.background import BackgroundScheduler  
def mainjob():
    print("It works!")

if __name__ == '__main__':
    sched = BackgroundScheduler()
    sched.start()
    sched.add_job(mainjob, 'interval', seconds=120)
    input("Press enter to exit.")
    sched.shutdown()