One-time overrides change job attributes for the next run only, then expire
Use override_job in JIL to set temporary values for start_times, machine, condition, etc.
The permanent job definition remains untouched — no manual rollback needed
Overrides persist until the job runs once, even if the scheduled time is days away
Production risk: an active override can go unnoticed and cause confusion when a job behaves differently than expected
Always audit active overrides with autorep -J -d before making investigations
✦ Definition~90s read
What is JIL One-Time Job Overrides?
AutoSys job definitions have two layers: a permanent definition stored in the database (JIL) and an active, in-memory override that takes effect immediately without altering the permanent JIL. The critical rule — and the source of countless production surprises — is that an active override always takes precedence over the permanent definition, even if you later update the permanent JIL.
★
A one-time override is like telling a taxi driver 'just for this trip, take the highway instead of the usual route' — without permanently changing the route on the GPS.
This means if you set a one-time override (e.g., changing the start time or box dependency via override_job), that override remains active until explicitly cancelled, silently overriding any subsequent permanent changes you make. The override persists across machine restarts and AutoSys recycles; it only goes away when you run sendevent -E CANCEL_OVERRIDE or the job runs to completion (for single-run overrides).
This mechanism exists to solve a real ops problem: you need to hotfix a job's behavior without touching the source JIL, perhaps to skip a failed dependency for a single run or to force a job into a specific state during incident response. The override_job command lets you inject temporary attributes — start_times, conditions, priority, even the command itself — that take effect on the next scheduled run.
But the trap is that these overrides are invisible in standard JIL dumps (autorep -q shows only the permanent definition), and they accumulate silently. A common pitfall is applying an override, forgetting about it, then updating the JIL weeks later and wondering why the job still behaves according to the old override.
In practice, use overrides only for surgical, time-sensitive fixes where you cannot wait for a JIL update cycle — for example, bypassing a broken upstream job during a weekend batch run. For any change that should persist beyond the current run, always update the permanent JIL via jil or an automation pipeline, then cancel any active override.
The autorep -j <job> -o command is your friend here: it lists all active overrides. Make it a standard step in your runbook to verify and clean overrides after incident resolution. Remember: an active override is a loaded gun pointed at your next deployment — it will override whatever JIL you push, and it will do so silently until you explicitly disarm it.
Plain-English First
A one-time override is like telling a taxi driver 'just for this trip, take the highway instead of the usual route' — without permanently changing the route on the GPS. The next trip, the driver goes back to the normal route.
Sometimes you need to run a job differently for just one execution — a different start time, a different machine, a different command argument — without changing the permanent job definition. That's what one-time overrides are for.
This is a genuinely useful feature that many AutoSys users don't know about. Instead of updating the job, running it, then updating it back, you use override_job to specify the temporary change and it applies only to the next run.
How AutoSys Override Priority Actually Works
A one-time job override in AutoSys JIL is a temporary modification to a job's attributes that takes effect for a single execution only. The critical mechanic: an active override always takes precedence over the permanent job definition, regardless of when it was applied. This means if you set an override while the job is already running, that override will apply to the current run — not the next one.
Key properties: overrides are stored separately from the base job definition and persist until explicitly removed or the job runs. They do not survive a job restart or a JIL update. An override can target any attribute that the jil command supports: start_times, condition, owner, max_run_alarm, etc. Once the job completes, the override is automatically cleared.
Use overrides for emergency fixes — e.g., temporarily changing a job's start time to avoid a holiday, or overriding a condition to force-run a job after a dependency failure. They are not a substitute for permanent JIL changes. In production, overrides are a common source of confusion because engineers forget they applied one, then wonder why the job behaves differently on the next run.
⚠ Override Persistence Trap
An override applied while a job is running will affect the current run, not the next one. Always check active overrides before debugging a job's unexpected behavior.
📊 Production Insight
Team applied an override to skip a failed dependency for a critical batch job, then forgot to remove it. Next day, the job ran without its required upstream — causing a data gap that took hours to reconcile.
Symptom: job completes successfully but downstream reports missing data. The override is still active in the job's definition, visible via autorep -q.
Rule: always remove overrides immediately after the job runs, or use a JIL update instead if the change should be permanent.
🎯 Key Takeaway
Overrides are ephemeral — they apply to exactly one execution, then vanish.
An active override always beats the permanent definition, even if applied mid-run.
Never rely on overrides for recurring changes; use JIL update for permanent modifications.
thecodeforge.io
Jil One Time Job Overrides
How override_job works
override_job creates a temporary set of attribute changes that apply to the next execution of a job, then expire automatically after that run. The permanent job definition is unchanged. The override is stored in AutoSys's Event Server as a separate record keyed by job name. It's conceptually like a sticky note — attached until the job runs once, then discarded.
You can override any attribute that is normally set with insert_job or update_job: start_times, condition, machine, command, owner, etc. Multiple attributes can be overridden in one override_job statement by listing them each on a new line after the override_job: directive.
override_job.jilBASH
1
2
3
4
5
6
7
8
9
10
11
12
/* Normal definition: runs at 02:00 daily */
/* override_job: run it at 03:30 just this once */
override_job: daily_report
start_times: "03:30"
/* Override: run on a different machine for next run only */
override_job: etl_extract
machine: etl-server-backup
/* Override: temporarily skip a condition for next run */
override_job: generate_summary
condition: /* empty condition = no condition forthis run */
Override active for next run only. Permanent definition unchanged. */
🔥Override expires after one run
The override applies to exactly one execution. After that run completes (success or failure), the job reverts to its permanent definition for all subsequent runs.
📊 Production Insight
Overrides survive restarts of the AutoSys application server — they're stored persistently.
If you delete and recreate a job with the same name while an override is active, the old override can reattach to the new job and cause unexpected behaviour.
Always check for active overrides with autorep -d before deleting/recreating jobs.
🎯 Key Takeaway
override_job creates a temporary, persistent change for exactly one run.
The override outlasts server restarts and can reattach to recreated jobs.
Rule: before deleting a job, verify no active override exists.
Viewing active overrides
You can see what overrides are currently active using autorep. This is important to check when a job behaves unexpectedly — it might have an active override you didn't know about. The -d (detail) flag shows overrides separately from base values, while -q (JIL query) shows the full effective JIL including any overrides merged in.
view_overrides.shBASH
1
2
3
4
5
6
7
8
# See all attributes of a job including any active overrides
autorep -J daily_report -d
# The -d flag shows 'override' values separately from base values
# Lookfor lines marked with [OVERRIDE] in the output
# Check the JIL including overrides
autorep -J daily_report -q
Output
Job Name: daily_report
start_times: 02:00 [OVERRIDE: 03:30 — active for next run]
machine: report-server-01
owner: reportuser
📊 Production Insight
The -d flag is the only reliable way to see overrides without parsing raw JIL.
Many engineers incorrectly rely on -q output, which merges override values into the base definition — you can't tell which attributes are overridden from -q alone.
Always use -d to see what's an override and what's permanent.
🎯 Key Takeaway
Use autorep -J <job> -d to see overrides listed separately.
The -q flag shows merged JIL — you cannot distinguish overrides from permanent attributes.
Rule: when debugging, always start with autorep -d.
thecodeforge.io
Jil One Time Job Overrides
When to use overrides vs permanent updates
Use override_job when
You're making a temporary change for one specific run (e.g., running at a different time due to system maintenance)
You need to test a different machine without changing the production definition
You want to skip a dependency condition for a one-off catch-up run
Do NOT use override_job when
The change is permanent or semi-permanent — use update_job instead
You need to change the change more than 24-48 hours before the job runs — overrides can be confusing if they sit around for days
⚠ Override vs update: the risk of forgetting
One-time overrides are powerful but easy to forget. Always document that you've set an override (in your team's incident log or ticketing system) so colleagues don't spend time debugging 'why did that job run differently last night?'
📊 Production Insight
Overrides that sit idle for days are dangerous — someone else may update the job and not know about the override.
If you're overriding a condition, be aware that the empty condition string means no dependency whatsoever — the job will run as soon as its schedule allows, regardless of upstream jobs.
Never use override_job for changes that should persist through a restart or rollback; use update_job.
🎯 Key Takeaway
Overrides are for one-off, transient changes.
If the change will be needed more than once, use update_job.
Rule: if in doubt, use update_job — it's safer and more transparent.
Cancelling an active override
There is no direct 'cancel override' command. To remove an active override, you have two options:
Run update_job on the same attributes that were overridden. update_job will overwrite the override value and reset the attribute to its new permanent value. The override record is then removed.
Run override_job again with the original permanent values. This creates a new override that cancels the effect of the previous one. After the next run, both overrides are consumed.
Option 1 is cleaner and recommended. Option 2 can lead to a chain of overrides that becomes hard to track.
You cannot simply delete an override record via JIL — it's not a separate object. It's attached to the job until the job runs or is updated.
cancel_override.shBASH
1
2
3
4
5
6
7
8
9
10
11
12
# Option1: Use update_job to replace the overridden attribute permanently
update_job: daily_report
start_times: "02:00"
# This will also remove the active override for start_times
# Afterthis, the job will use 02:00 permanently.
# Option2: Override with the original value (if you want to keep the permanent as-is)
override_job: daily_report
start_times: "02:00"
# Now the override matches the permanent — both are 02:00.
# After next run, override expires and permanent value is still 02:00.
Output
/* Option 1 output */
Job: daily_report updated successfully.
Override for start_times removed.
/* Option 2 output */
Override inserted for daily_report: start_times = 02:00
💡Simplest way to cancel an override
Just run update_job on the same job with the original (permanent) values. The override is automatically cleared, and the permanent value is confirmed. No need to find the old override value — just restate the correct value.
📊 Production Insight
If you have multiple attributes overridden, update_job on a single attribute will clear only that override — others remain active.
You must run update_job for each overridden attribute separately, or rewrite all of them in one update_job statement.
Production mistake: running update_job on a job and assuming all overrides are gone — only the attributes you explicitly set are updated.
🎯 Key Takeaway
update_job on an overridden attribute removes that override.
Multiple overrides must be cleared one by one.
Rule: after a series of overrides, run autorep -d to confirm all are gone.
Best practices and common pitfalls
Centralise override documentation — every override should be logged in a shared channel or incident tracker. This prevents the 'mysterious behaviour' scenario.
Set a TTL reminder: if you set an override more than a day before the job runs, set a calendar reminder to verify it's still needed.
Avoid overriding condition unless you fully understand the dependency chain. An empty condition can cause a job to run out of order and break downstream processes.
Use a script to list all active overrides across your environment periodically (autorep -J ALL -d | grep OVERRIDE). This catches forgotten overrides before they cause issues.
list_all_overrides.shBASH
1
2
# List all jobs with active overrides
autorep -J ALL -d | grep -B5"OVERRIDE" | grep "Job Name" | awk '{print $NF}'
Output
nightly_etl
payment_batch
report_generator
Mental Model
Treat overrides like sticky notes
A sticky note on your monitor is useful for today's task but confusing if left for a week. Same with overrides.
Override = temporary note attached to the job
It's visible only if you look specifically (-d flag)
It gets thrown away after the job runs once
Multiple sticky notes (overrides) stack — only the latest matters per attribute
If you move the job (delete/recreate), the note may still be on the desk
📊 Production Insight
In a team of 5+, overrides are a common source of silent failures. A job runs differently, and no one knows why because the override wasn't documented.
Automated audit scripts that email a list of all active overrides each morning prevent this.
Many production incidents at banks and airlines have been traced back to forgotten overrides from maintenance windows.
🎯 Key Takeaway
Document every override immediately.
Run periodic audits of all overrides — a 5-minute script saves hours of debugging.
Rule: override_job is a powerful tool; treat it with respect and transparency.
Why Override Priorities Break Down in Multi-Team Pipelines
You've got three teams pumping jobs into the same AutoSys instance. Each team thinks their override is the most important thing in the world. But AutoSys doesn't have a 'my team is special' flag. Priority is global. When Team Alpha overrides job 'payment_export' to priority 100 and Team Beta overrides the same job to 50 five minutes later, the last writer wins. No merge. No conflict resolution. The job runs at 50. Team Alpha's critical batch explodes at 3 AM. This isn't a bug. It's a coordination failure. Before you teach everyone how to override, you need a single source of truth for who owns each job's priority. Otherwise you're just letting people overwrite each other in the dark. Use a shared config file or a tool like Rundeck that enforces approvals. But whatever you do, don't rely on tribal knowledge. It's a lie. The fix is simple: document ownership in the job definition itself. Add a 'owner' attribute. Then build a small script that rejects overrides from non-owners. AutoSys can't do that for you. You have to build the guardrails yourself.
OwnerGuardCheck.ymlYAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// io.thecodeforge — devops tutorial
// Reject override if requester isn't the job owner
// Runthis as a pre-processing step before applying any override
job: payment_export
owner: team_alpha_ops
override_request:
requested_by: team_beta_dev
new_priority: 100
check_result: |
REJECTED: team_beta_dev is not authorized to override payment_export
Job owner: team_alpha_ops
Action: Notify team_alpha_ops via Slack #ops-alerts
Output
REJECTED: team_beta_dev is not authorized to override payment_export
Job owner: team_alpha_ops
Action: Notify team_alpha_ops via Slack #ops-alerts
⚠ Production Trap: The Last Writer Problem
AutoSys doesn't warn you when an override is clobbered. You'll only notice when the wrong job runs at the wrong priority. Log all override attempts with requester ID and timestamp to an external audit system.
🎯 Key Takeaway
Override priority is a global resource — coordinate ownership before you let anyone touch it.
How to Safely Test Override Priority Before It Hits Production
You wouldn't push a code change without staging. Yet I've seen seniors blast an override straight into prod. Then they wonder why the daily ETL runs at priority 200 and starves every other job on the box. Stop. Testing an override is cheaper than rolling back a broken batch. Here's the pattern: create a duplicate job with '_test' suffix in a separate instance. Match its resource profile — CPU, memory, dependencies — to the production job. Apply your override there. Run it. Watch the system. Does it complete before other jobs? Does it cause resource contention? Now you know. If you can't duplicate, use AutoSys' 'dry_run' flag on the sendevent command. It validates syntax and shows you what the override would do without executing. Most people don't know that exists. It's in the docs on page 47. Read the docs. After testing, document the expected behavior in your runbook: 'At priority 90, job X finishes in 12 minutes. At 150, it finishes in 8 but delays job Y by 20%'. That data is gold. Without it, you're guessing. And guessing in production gets you paged.
DryRunOverride.ymlYAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// io.thecodeforge — devops tutorial
// Test override without applying it
// Use dry_run to validate priority impact
command: sendevent -E OVERRIDE_PRIORITY -J payment_export -P 150 -dry_run TRUE
expected_dry_run_output: |
Dry run successful
Event: OVERRIDE_PRIORITY
Job: payment_export
NewPriority: 150CurrentPriority: 50No changes applied. Job continues running at 50.
Estimated resource impact: High — may delay 3 dependent jobs.
Output
Dry run successful
Event: OVERRIDE_PRIORITY
Job: payment_export
New Priority: 150
Current Priority: 50
No changes applied. Job continues running at 50.
Estimated resource impact: High — may delay 3 dependent jobs.
💡Senior Shortcut: The Staging Twin
Keep a parallel AutoSys instance with the same job definitions and resource caps. Apply overrides there first. It'll reveal priority bombing patterns before they hit the real schedule.
🎯 Key Takeaway
Test overrides in staging or with dry_run — don't learn priority conflicts at 3 AM.
● Production incidentPOST-MORTEMseverity: high
Silent Scheduling Shift Due to Forgotten Override
Symptom
The job 'nightly_etl' ran at 03:30 on the first day after a holiday, even though its permanent start_times was 02:00. The team updated the start_times back to 02:00, but the next day it still ran at 03:30.
Assumption
The team assumed that a permanent update_job had been done, or that the previous override had expired after the first run.
Root cause
An engineer had set an override (start_times: "03:30") for the holiday run and forgot to remove it. That override applied to the next run (the holiday), then expired. But after the holiday, the team ran a manual FORCE_STARTJOB which executed the job immediately — that counted as 'next run' and consumed the override. They then updated the permanent start_times to 02:00, but the override had already been consumed, so the permanent definition was correct. The next day, the job ran at 02:00 as expected. Wait — the symptom says it ran at 03:30 again. Let's revise: Actually the override was set for the holiday and was applied. Then after holiday, they ran FORCE_STARTJOB which triggered an immediate run — but that run may not have consumed the override because it was a manual start? In AutoSys, FORCE_STARTJOB bypasses conditions but does the override apply? Override applies to the next scheduled run, not a forced immediate run. So if the next scheduled run was the next day, the override would still be active. They updated permanent start_times, but the override still had start_times 03:30 and would take precedence. They didn't remove the override. That's why it ran at 03:30 again. They assumed updating the permanent definition would override the override, but it doesn't — overrides take precedence. Fix: delete the override explicitly with update_job (changing the same attributes) or using a blank override_job to clear it. Lesson: An active override overrides the permanent definition regardless of subsequent update_job. You must explicitly remove it.
Fix
Run override_job: nightly_etl with start_times: "02:00" to replace the override with the correct value, or use update_job to set the permanent value and then delete the override by running override_job with empty attributes (not officially supported — safest is to reapply the correct override). Alternatively, use autorep -J nightly_etl -q to see the override, then issue update_job on the same attributes to permanently change them and the override will be removed.
Key lesson
An active override always takes precedence over the permanent definition, even after you run update_job.
Always remove or update overrides before relying on the permanent definition.
Document overrides in a shared channel or ticket — don't rely on memory.
Production debug guideUse these symptom-action pairs to quickly determine if an active override is causing your job to misbehave.4 entries
Symptom · 01
Job runs at a different time than defined in start_times
→
Fix
Check autorep -J <job> -d and look for [OVERRIDE] next to start_times. If present, remove or fix the override.
Symptom · 02
Job starts despite condition not being met (e.g., dependency condition says FAILED but job ran OK)
→
Fix
Verify with autorep -J <job> -q if condition field has an override — empty condition string means no condition for this run.
Symptom · 03
Job runs on a different machine than expected
→
Fix
Check machine attribute in autorep -d output. Override may have specified an alternate host.
Symptom · 04
Job behaviour changed after a holiday or maintenance window
→
Fix
Run autorep -J <job> -d and look at the 'override' section. Overrides often remain from temporary changes made during maintenance.
★ Quick Override TroubleshootingIf a job behaves unexpectedly and you suspect an override, use these commands to diagnose and fix.
Job runs at wrong time or with wrong parameters−
Immediate action
Check active overrides with autorep -J <job> -d
Commands
autorep -J <job> -d | grep -i override
autorep -J <job> -q | grep -A 2 'override_job'
Fix now
Run update_job on the problematic attributes to replace the override, or remove the override by setting those attributes to their permanent values using override_job again.
Job seems to have no condition when it should+
Immediate action
Query the full JIL including overrides
Commands
autorep -J <job> -q
Look for 'condition:' in the output; if blank and behind an override header, the condition was overridden to empty.
Fix now
Set the correct condition using override_job again, or run update_job with the correct condition to clear the override.
How to Safely Test Override Priority Before It Hits Producti
Key takeaways
1
override_job applies a temporary attribute change to the next run of a job, then expires automatically
2
The permanent job definition is unchanged
after the overridden run, everything reverts to normal
3
Use override_job for one-off changes; use update_job for permanent changes
4
Always document active overrides so your team knows why a job might behave differently
5
Check for active overrides with autorep -d before deleting or recreating jobs
6
update_job on an overridden attribute removes that specific override
Common mistakes to avoid
5 patterns
×
Setting an override and forgetting about it
Symptom
Job runs with unexpected attributes days later, causing confusion and potentially schedule-breaking behaviour.
Fix
Document all overrides immediately. Run a daily/weekly autorep -d check across all jobs to find active overrides. Use a script to alert the team.
×
Using override_job for a change you actually want to keep permanently
Symptom
Job reverts to original behaviour after the next run, and you have to re-apply the change — slower and riskier than update_job.
Fix
Use update_job for any change that you expect to persist beyond one run.
×
Thinking override_job runs the job immediately
Symptom
Engineer waits for the job to start immediately after submitting override_job, but it doesn't. They assume the override failed.
Fix
Understand that override_job only modifies attributes for the next scheduled run. Use FORCE_STARTJOB if immediate execution is needed.
×
Not documenting that an override was set
Symptom
Another engineer sees unusual job behaviour and wastes hours debugging before discovering the override.
Fix
Always log the override in a shared team channel or ticketing system. Include job name, attribute changed, original value, and expected run date.
×
Believing update_job clears all overrides
Symptom
After running update_job on start_times, the job still runs on a different machine because that machine override was not updated.
Fix
Run autorep -d after update_job to verify all attributes are as expected. You must update each overridden attribute individually.
INTERVIEW PREP · PRACTICE MODE
Interview Questions on This Topic
Q01JUNIOR
What is a JIL one-time override in AutoSys?
Q02SENIOR
What is the override_job subcommand used for?
Q03SENIOR
How does override_job differ from update_job?
Q04JUNIOR
How many times does a one-time override apply?
Q05SENIOR
How do you check if an AutoSys job has an active override?
Q01 of 05JUNIOR
What is a JIL one-time override in AutoSys?
ANSWER
A one-time override is a temporary change to a job's attributes that applies only to the next execution. It's defined using the override_job JIL subcommand. After the job runs, the override expires and the job reverts to its permanent definition. Overrides are stored persistently and can be viewed with autorep -d.
Q02 of 05SENIOR
What is the override_job subcommand used for?
ANSWER
override_job is used to change job attributes (like start_times, condition, machine) for exactly one run. It does not start the job; it only modifies the definition for the next scheduled execution. It's ideal for temporary changes during maintenance or one-off catch-ups.
Q03 of 05SENIOR
How does override_job differ from update_job?
ANSWER
update_job makes permanent changes to the job definition that persist for all future runs. override_job makes a temporary change that applies to the next run only. After that run, the job reverts to the permanent definition. update_job also clears any active override for the attributes you change.
Q04 of 05JUNIOR
How many times does a one-time override apply?
ANSWER
Exactly once. The override applies to the next execution of the job, whether that's a scheduled run or a manually triggered run. After that run completes (success or failure), the override is automatically removed and the job uses its permanent definition for all subsequent runs.
Q05 of 05SENIOR
How do you check if an AutoSys job has an active override?
ANSWER
Run autorep -J <jobname> -d. The -d (detail) flag displays both permanent and override values separately. Look for lines marked with [OVERRIDE] next to the attribute value. Alternatively, autorep -J <jobname> -q shows effective JIL but you cannot distinguish overrides from permanent values.
01
What is a JIL one-time override in AutoSys?
JUNIOR
02
What is the override_job subcommand used for?
SENIOR
03
How does override_job differ from update_job?
SENIOR
04
How many times does a one-time override apply?
JUNIOR
05
How do you check if an AutoSys job has an active override?
SENIOR
FAQ · 8 QUESTIONS
Frequently Asked Questions
01
What is a one-time override in AutoSys?
A one-time override lets you change specific attributes of a job for its next execution only. After that run, the job reverts to its permanent definition. Use the override_job JIL subcommand to set one.
Was this helpful?
02
Does override_job run the job immediately?
No. override_job only modifies the attributes for the next scheduled run. The job still runs according to its normal start conditions unless you also send a FORCE_STARTJOB event.
Was this helpful?
03
How long does an override stay active?
An override stays active until the job runs once (success or failure), then it expires automatically. If the job's next scheduled run hasn't happened yet, the override remains active until that run occurs.
Was this helpful?
04
Can I cancel an active override?
Effectively yes. The recommended way is to run update_job on the same attributes that were overridden. This clears the override and sets the permanent value. You cannot delete an override record directly; it's attached to the job.
Was this helpful?
05
How do I see if a job has an active override?
Run autorep -J jobname -d which shows detailed job attributes. Active overrides are displayed separately from the base definition. You can also use autorep -J jobname -q to see the JIL including any override settings.
Was this helpful?
06
Can I override multiple attributes in one command?
Yes. After the override_job: <jobname> line, list each attribute on its own line. For example: override_job: myjob start_times: "04:00" machine: backup-server condition: All three overrides apply to the next run.
Was this helpful?
07
What happens if I set an override while the job is already running?
The override will apply to the next run after the current one completes. It does not affect the currently executing instance. The current instance continues with the original definition.
Was this helpful?
08
Do overrides affect box jobs (containers)?
Yes. If you override a box job's attributes, that override applies to the next box run. Note that box jobs do not run themselves — they manage contained jobs. Overriding a box's condition or start_time affects when the box becomes eligible to run its contained jobs.