AutoSys run_calendar — Jobs Go Silent When Calendars Expire
Static calendars like business_days_2025 have no dates after Dec 31st.
20+ years shipping production infrastructure and CI/CD at scale. Notes here come from systems that actually shipped.
- AutoSys calendar = named date list for scheduling jobs on business days, holidays, or custom patterns — standard (explicit dates) or extended (logical rules)
- Key components: run_calendar (run on these dates), exclude_calendar (skip these dates), autocal_asc (calendar management command)
- Performance: Calendar lookup is O(1) hash check per job evaluation; 10,000 jobs with calendars = minimal overhead
- Production trap: Calendar with explicit dates not updated at year-end — jobs scheduled on expired calendar never run again
- Biggest mistake: Setting both days_of_week AND run_calendar — runs only on intersection (days that satisfy both), often unintended, causes jobs to never run
AutoSys calendars are custom day lists — like a company holiday calendar for your batch jobs. Instead of just 'run on weekdays', you can say 'run on every business day that isn't a public holiday or month-end close' — and AutoSys handles the date logic for you.
Time-based scheduling with days_of_week covers most simple cases, but enterprise batch processing often needs more nuanced scheduling. Month-end jobs that only run on the last business day. Jobs that must skip public holidays. Quarter-end runs. AutoSys calendars solve exactly this.
There are two calendar types: standard calendars (a list of dates) and extended calendars (built from logical rules). Both are defined using the autocal_asc command or through the WCC UI.
But calendars are dangerous. A calendar with explicit dates for 2025 will stop working on January 1, 2026. Jobs that depend on it will never run again. The intersection between days_of_week and run_calendar is another trap — if you set both, the job runs only on days that satisfy BOTH conditions, which is rarely what you intend.
By the end you'll know exactly how to create and manage calendars, use run_calendar and exclude_calendar correctly, avoid the year-end trap, and debug why a job isn't running on days you expect it to.
How run_calendar Silences Jobs When It Expires
run_calendar is a named calendar object in AutoSys that defines a set of dates on which a job is allowed to run. When attached to a job definition via the run_calendar attribute, the job will only execute if the current date is included in that calendar. The core mechanic: calendars are evaluated at job start time, and if the date is not in the calendar, the job is skipped — it does not fail, it simply does not start. This is a binary gate: present in calendar → runs; absent → silent skip.
Calendars are typically defined as a list of specific dates (e.g., '2025-01-01', '2025-01-15') or as a repeating pattern (e.g., 'every Monday'). The critical property: calendars have an end date. Once the last defined date passes, the calendar is effectively expired. Any job referencing an expired calendar will never run again, because no future date will ever match. AutoSys does not warn or alert on this condition — the job simply stops starting. The job status remains INACTIVE or SUCCESS, with no error code.
Use run_calendar when you need to restrict job execution to specific business days, holidays, or maintenance windows. It is essential for batch processing that must only run on certain days (e.g., month-end reports, quarterly payroll). The danger: teams often set calendars with a fixed end date and forget to extend them. When the calendar expires, the job goes silent — no alerts, no failures, just a gap in processing that may go unnoticed until a downstream system breaks.
Standard calendars — a list of dates
A standard calendar is simply a named list of dates. Jobs with run_calendar: your_calendar_name will run on those dates and only those dates.
Using run_calendar and exclude_calendar
Once calendars are defined, apply them to jobs with run_calendar (run on these days) and exclude_calendar (don't run on these days).
Viewing and managing existing calendars
You can query, list, and report on existing calendars using autocal_asc in report mode. This is useful when you need to audit which jobs are using which calendars, or verify a calendar's dates before a major batch run.
autorep -J % -q to find jobs referencing a calendar.autorep -J % -q | grep run_calendar | grep 2025 to alert on expired calendars before they cause job failures.Why Run_Calendar Is Not a Cron — The Expiry Trap
Every junior thinks a run_calendar is just a fancy cron. It's not. A cron keeps running until you kill it. A run_calendar has an expiry date baked into its definition. When that date passes, the calendar is dead. Jobs tied to it stop running. No warning. No email. Just silence.
Here's the WH: Autosys calendars are time-boxed by design. They're meant for maintenance windows, project timelines, seasonal batches. Not perpetual schedules. If you use a run_calendar for something that should run forever, you will get paged at 3 AM when the expiry creeps up on you.
How do you check? Run autocal_asc -q <calendar_name> and look for start_date and end_date. If end_date is yesterday, your calendar is a ghost. The job definition still exists. The calendar still exists. But Autosys evaluates the run_calendar against the current date, finds it expired, and skips the job. This is not a bug. It is the feature that will bite you if you don't respect it.
How Run_Calendar Eats Exclude_Calendar — Priority Pitfalls
Exclude_calendar sounds simple: blackout dates. But there's a nasty interaction when you combine it with run_calendar. Autosys evaluates both. The rule: if the current date matches run_calendar AND does NOT match exclude_calendar, the job runs. If both match, exclude wins. That's the theory.
Here's the WHY: People assume exclude_calendar is an override. It is, but only if Autosys reaches that evaluation. If the run_calendar is empty (no dates defined) or expired, Autosys never even checks exclude_calendar. The job simply doesn't trigger. You think you excluded the date. Reality: the run_calendar never included today.
Second pitfall: overlapping calendars. If run_calendar says "last Friday of every month" and exclude_calendar says "Dec 25", but Dec 25 happens to be the last Friday, Autosys will skip it. That's correct. But if you updated exclude_calendar but forgot to update run_calendar's end_date, the exclusion is meaningless. Check both. Every time.
Third: exclude_calendar can't compensate for a broken run_calendar. If run_calendar is misconfigured (e.g., wrong weekday), no amount of excludes will fix it. The logic is AND-based, not OR.
autocal_asc -q <run_cal> and autocal_asc -q <exclude_cal> in the same session. If run_cal is expired or returns empty, exclude_cal is lying dead in the config. Fix the run_cal first.The Calendar That Died on December 31st
business_days_2025 was created as a standard calendar with explicit dates for 2025. On January 1, 2026, the calendar had no dates. The job's date condition checked the run_calendar, found no match, and remained INACTIVE. No alarm fired because the job didn't fail — it just never started. The team had no automated process to update calendars annually. The calendar naming convention included the year, but no reminder or audit existed to create business_days_2026 before January 1.business_days_2026 with 2026 business dates.
2. Updated job JIL: update_job: monthly_recon run_calendar: business_days_2026.
3. Automated calendar creation: added a scheduled AutoSys job that runs on December 15 each year to create next year's business day calendar using a script that calculates business dates (excluding weekends and holidays).
4. Added a monitoring alert: weekly check for any job with run_calendar containing previous year's dates, flagging them for review.
5. Changed naming convention to business_days (without year) for dynamic calendars using extended calendar logic (when available).- Standard calendars are static date lists. They do not auto-update. You must refresh them annually.
- Calendar names with years (e.g., business_days_2025) are a ticking time bomb. Use year-less names and update the calendar content, not the name.
- A job that never starts is worse than a job that fails — there's no alarm, no error log, just silence.
- Automate calendar creation before year-end. A scheduled job that runs in December can create next year's calendars automatically.
autorep -J job_name -d | grep run_calendar. Then verify calendar contents: autocal_asc -r calendar_name. If calendar is year-specific (e.g., 2025), it may have expired.autorep -J job_name -d | grep exclude_calendar. Verify exclude_calendar contains the holiday date: autocal_asc -r exclude_calendar_name.autocal_asc -r calendar_name. Ensure date format is YYYYMMDD. For standard calendars, dates must be sorted. Check for trailing commas in date list.autorep -J job_name -d | grep -E 'run_calendar|exclude_calendar'autocal_asc -r $(autorep -J job_name -q | grep run_calendar | awk '{print $2}')Key takeaways
Common mistakes to avoid
5 patternsNot updating standard calendars at year-end — jobs stop running
Setting both days_of_week AND run_calendar on same job
Forgetting to create exclude_calendar before referencing it in JIL
Using standard calendars where extended calendars would be more maintainable
Case mismatch between calendar definition and run_calendar attribute
autocal_asc -r % to see exact case of existing calendars. Copy-paste calendar name into JIL.Interview Questions on This Topic
What is a run_calendar in AutoSys?
Frequently Asked Questions
JIL syntax, sendevent, autorep, box jobs, file watchers, scheduling, HA, security, cloud workload automation, and 22 interview questions — the definitive AutoSys reference for production engineers.
20+ years shipping production infrastructure and CI/CD at scale. Notes here come from systems that actually shipped.
That's AutoSys. Mark it forged?
4 min read · try the examples if you haven't