3
\$\begingroup\$

I want to execute a python script daily and thereby want to schedules task as follows.

The idea is that the script will run once daily, and the script will then decide what tasks to be done today.

The reason is that I can't use cron or windows scheduled task on my environment.

The question is that, is there any better idea?

from datetime import datetime
import os
from sheduled_tasks import daily_task1, daily_task2, weekly_task, monthly_tasks
tasks = {} # or open from saved pickel file
schedule = {
 1: [daily_task1, daily_task2],
 7: [weekly_task],
 30: [monthly_tasks],
}
for delta, stasks in schedule.items():
 for task in stasks:
 name = task.__name__
 if ((task not in tasks) or
 (datetime.now() - tasks[name]).days >= delta):
 task()
 tasks[task.name] = datetime.now().replace(hour=6)
# pickle tasks
asked Jul 6, 2019 at 8:18
\$\endgroup\$
6
  • 2
    \$\begingroup\$ does your script get executed once daily, or does it just sit on your OS as a process 24/7? \$\endgroup\$ Commented Jul 6, 2019 at 12:44
  • 1
    \$\begingroup\$ What's your environment? Surely there's a better solution. \$\endgroup\$ Commented Jul 6, 2019 at 13:37
  • \$\begingroup\$ @FirefoxMetzger: Executed once daily. It doesn't sit on your OS as a process 24/7. \$\endgroup\$ Commented Jul 8, 2019 at 4:20
  • \$\begingroup\$ @Reinderien: Custom python (Linux based) environment without bash or anything. Just once daily python only task. I can request any python module from pypi. \$\endgroup\$ Commented Jul 8, 2019 at 4:26
  • \$\begingroup\$ I see. Should it be 'every week/month/year starting from the first invocation' or 'regularly in a weekly/monthly/yearly interval'? \$\endgroup\$ Commented Jul 8, 2019 at 9:40

1 Answer 1

2
\$\begingroup\$

You can get rid of doing any I/O and make your code cleaner in the process.

from datetime import datetime
from sheduled_tasks import daily_task1, daily_task2, weekly_task, monthly_tasks
schedule = {
 1: [daily_task1, daily_task2],
 7: [weekly_task],
 30: [monthly_tasks],
}
# this could also be the date of first invocation, just change the timestamp
arbitrary_date = datetime.fromtimestamp(1234567890)
days_past = (datetime.now() - arbitrary_date).days
for delay, tasks in schedule.items():
 if days_past % delay == 0:
 [task() for task in tasks]
answered Jul 8, 2019 at 10:10
\$\endgroup\$
3
  • \$\begingroup\$ It took a while for me to understand. This is perfect for my continuously running server with power backup. I think for non-power backup server, it may fail. Thanks for simplification. \$\endgroup\$ Commented Jul 8, 2019 at 11:42
  • \$\begingroup\$ @RahulPatel That depends if you expect your server to fail for more than 24h. To comment on that, however, we would need more information about the actual environment than just the snippet and 'it will be executed once a day', because the latter is not the case if you have more than 24h downtime. \$\endgroup\$ Commented Jul 8, 2019 at 12:47
  • \$\begingroup\$ Agreed. Most of the time, the server is not dead for 24 hour. \$\endgroup\$ Commented Jul 9, 2019 at 5:00

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.