Cron Holiday Scheduling — Managing Cron Jobs on Holidays and Non-Working Days
In this tutorial, you will learn about Cron Holiday Scheduling. We cover key concepts, practical examples, and best practices to help you master this topic.
Learn cron holiday scheduling: skip non-critical Cron Jobs on public holidays, reschedule missed jobs after holidays, manage holiday calendars for multiple regions, and build holiday-aware cron wrapper scripts.
What You Learn
You will learn how to handle holidays in cron scheduling: defining holiday calendars, skipping non-critical jobs on holidays, rescheduling missed jobs, and managing region-specific holiday rules.
Why It Matters
A report generation cron job that runs on Christmas Day at 8 AM sends a PDF to nobody. A database backup that fails on a holiday goes unnoticed until the next business day. Holiday-aware cron jobs prevent wasted resources and missed notifications.
Real-World Use
DodaTech maintains a holiday calendar per region (US, EU, APAC). Non-critical cron jobs (reports, analytics, cache warming) are skipped on holidays. Critical jobs (security monitoring, certificate renewal, database backups) still run but with relaxed alerting thresholds.
Holiday Calendar
import json
from datetime import date, timedelta
class HolidayCalendar:
def __init__(self, region="US"):
self.region = region
self.holidays = set()
def add_holiday(self, year, month, day, name=""):
self.holidays.add(date(year, month, day))
def load_us_holidays(self, year):
holidays = [
(1, 1, "New Year's Day"),
(1, self._mlk_day(year), "Martin Luther King Jr. Day"),
(2, self._presidents_day(year), "Presidents' Day"),
(5, self._memorial_day(year), "Memorial Day"),
(7, 4, "Independence Day"),
(9, self._labor_day(year), "Labor Day"),
(11, self._thanksgiving_day(year), "Thanksgiving Day"),
(11, self._thanksgiving_day(year) + 1, "Black Friday"),
(12, 25, "Christmas Day"),
]
for month, day, name in holidays:
self.add_holiday(year, month, day, name)
def _mlk_day(self, year):
d = date(year, 1, 15)
while d.weekday() != 0:
d += timedelta(days=1)
return d.day
def _presidents_day(self, year):
d = date(year, 2, 15)
while d.weekday() != 0:
d += timedelta(days=1)
return d.day
def _memorial_day(self, year):
d = date(year, 5, 31)
while d.weekday() != 1:
d -= timedelta(days=1)
return d.day
def _labor_day(self, year):
d = date(year, 9, 1)
while d.weekday() != 0:
d += timedelta(days=1)
return d.day
def _thanksgiving_day(self, year):
d = date(year, 11, 1)
thursdays = 0
while thursdays < 4:
if d.weekday() == 3:
thursdays += 1
if thursdays < 4:
d += timedelta(days=1)
return d.day
def is_holiday(self, check_date=None):
if check_date is None:
check_date = date.today()
return check_date in self.holidays
def next_business_day(self, from_date=None):
if from_date is None:
from_date = date.today()
d = from_date + timedelta(days=1)
while d.weekday() >= 5 or d in self.holidays:
d += timedelta(days=1)
return d
cal = HolidayCalendar("US")
cal.load_us_holidays(2026)
test_date = date(2026, 12, 25)
print(f"Dec 25 is holiday: {cal.is_holiday(test_date)}")
print(f"Next business day after Dec 25: {cal.next_business_day(test_date)}")
Expected output:
Dec 25 is holiday: True
Next business day after Dec 25: 2026-12-28
Holiday-Aware Cron Job
import time
from datetime import date
class HolidayAwareCronJob:
def __init__(self, name, holiday_calendar, critical=False):
self.name = name
self.calendar = holiday_calendar
self.critical = critical
self.skipped = 0
def should_run(self):
today = date.today()
is_holiday = self.calendar.is_holiday(today)
if is_holiday and not self.critical:
print(f"[{self.name}] Skipped: {today} is a holiday")
self.skipped += 1
return False
if is_holiday and self.critical:
print(f"[{self.name}] Running (critical) despite holiday")
return True
return True
def run(self, job_fn):
if self.should_run():
return job_fn()
return None
cal = HolidayCalendar()
cal.load_us_holidays(2026)
cal.add_holiday(2026, 6, 29, "Test Holiday") # Test with a known date
non_critical = HolidayAwareCronJob("daily-report", cal, critical=False)
critical = HolidayAwareCronJob("security-scan", cal, critical=True)
# Simulate running on June 29 (added as holiday)
print(f"Non-critical report: will run? {non_critical.should_run()}")
print(f"Critical security scan: will run? {critical.should_run()}")
Expected output:
[daily-report] Skipped: 2026-06-29 is a holiday
Non-critical report: will run? False
[security-scan] Running (critical) despite holiday
Critical security scan: will run? True
Common Mistakes
1. Assuming Weekends Are the Only Non-Working Days
Public holidays vary by country, region, and even industry. A job that runs on weekdays may run on a holiday that is a workday for some but not others. Maintain a holiday calendar per region.
2. Skipping Critical Jobs on Holidays
Security monitoring, certificate renewal, and database backups must run every day, including holidays. Classify jobs as critical (must run) or non-critical (can skip). Apply holiday rules only to non-critical jobs.
3. Not Rescheduling Skipped Jobs
If a daily report is skipped on a holiday, it should either run on the next business day or be marked as missed. Implement a missed-job queue: after a holiday, run all skipped non-critical jobs with a deprioritized flag.
4. One Calendar for All Regions
A company with teams in the US, EU, and APAC needs separate holiday calendars. A job running on US Thanksgiving should not skip for APAC users. Tag jobs with their target region and check the appropriate calendar.
5. No Holiday Notification
When a job is skipped due to a holiday, stakeholders need to know. Send a notification that the job was skipped due to a holiday and when it will next run. This prevents confusion about missing reports.
Practice Questions
1. How do you define a holiday calendar for cron jobs?
Store holidays as date entries in a configuration file, database, or API. Maintain separate calendars per region. Each job references its region's calendar at runtime. Update calendars annually for new holiday dates.
2. Which cron jobs should still run on holidays?
Critical jobs: security monitoring, certificate renewal, database backups, system health checks, and infrastructure monitoring. Non-critical jobs: reports, analytics, cache warming, data cleanups, and non-urgent notifications.
3. How do you handle a job skipped due to a holiday?
Queue the job for execution on the next business day. If the job is a report, consider generating it for the missed day or skipping it entirely if it has no business value after the delay.
4. How do you manage holidays for global teams?
Maintain a holiday calendar per region (US, EU, APAC, etc.). Each job references its target region's calendar. A global report team might skip jobs on both US and EU holidays depending on the report audience.
Challenge
Build a holiday-aware cron system: (1) holiday calendar manager supporting multiple regions (US, EU, JP, AU) with auto-loading for the next 5 years, (2) job classification: critical (always run), important (run on holidays but relaxed alerting), non-critical (skip on holidays), (3) missed-job queue: store skipped jobs, run them on the next business day with deprioritized priority, (4) notification: Slack message when a job is skipped due to holiday, email summary of missed jobs after a holiday period, (5) dashboard: upcoming holidays per region with affected jobs, missed job queue status.
FAQ
Mini Project: Holiday-Aware Cron System
Build a holiday-aware cron scheduling system: (1) holiday calendar with support for 5 regions (US, EU, UK, JP, AU), fixed holidays, floating holidays (Easter, Thanksgiving), and observed holidays, (2) job classifier: critical (always run), important (run with relaxed alerts), non-critical (skip), (3) missed-job queue with SQLite persistence: stores skipped jobs with timestamp and reason, runs them on next business day, (4) automatic holiday update: cron job that loads the next year's holidays on December 1st, (5) notification: Slack on skip with expected next-run date, email digest after multi-day holidays, (6) dashboard: upcoming holidays per region, affected job count, missed queue status.
What's Next
Now that you understand holiday scheduling with cron, explore managing cron dependencies, then learn about retry patterns for cron.
Built by the developers of DodaTech
Doda Browser, DodaZIP & Durga Antivirus Pro