I would like to run a python script during the night and so I was thinking of using APScheduler. I'll start running it at 1am of the following night and it will run once every night
my scheduler script looks like this (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)
In the shell, I do:
python myScheduler.py & disown
(I'm running it remotely, so I want to run it in the background and disown it.
Immediately, a number (PID) appears below the line, as every other python script would do. But when I do ps -e | grep python, that number is not there. I tried to do kill -9 PID
and I got a message saying that the job does not exist.
Is the scheduler running? If yes开发者_JS百科, how can I stop it? if not, what am I doing wrong?
you have to keep the script running otherwise after the sched.add_interval_job(myScript, start_date = startDate, days=1)
, the script ends and stop.
add a
import time
while True:
time.sleep(10)
sched.shutdown()
after, and then, the scheduler will still be alive.
The correct solution would be to tell the scheduler to not run as a daemon:
sched = Scheduler()
sched.daemonic = False
or
sched = Scheduler()
sched.configure({'apscheduler.daemonic': False})
I have apscheduler v3 installed and this is what I would do.
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()
here is my way:
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()
If you use version 2.1.0, you can also pass standalone=True parameter to the Scheduler constructor. Detail documents can be found here
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()
I think you should use the blocking scheduler nowadays.
from apscheduler.schedulers.blocking import BlockingScheduler
scheduler = BlockingScheduler()
# scheduler.add_job(...)
scheduler.add_interval_job(myScript, start_date = startDate, days=1)
scheduler.start()
精彩评论