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
, и у меня появилось сообщение о том, что работа не существует.
Работает ли планировщик? Если да, как я могу остановить его? если нет, что я делаю неправильно?
Ответы
Ответ 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()