AutoSys ON_ICE vs ON_HOLD — Why Release Timing Skips Jobs
ON_ICE released at 2:30 AM skipped the 2 AM run entirely, delaying settlement 24 hours.
20+ years shipping production infrastructure and CI/CD at scale. Notes here come from systems that actually shipped.
- ON_HOLD (OH): job is frozen; release means it starts immediately if conditions are currently true
- ON_ICE (OI): job is deeply suspended; release waits for conditions to reoccur in the next cycle
- Key difference: time conditions are evaluated ONCE under ON_ICE, but are currently true under ON_HOLD
- Production impact: using ON_HOLD when you meant ON_ICE can cause a job to run outside its window
- Most common mistake: assuming both behave the same on release — they don't
ON_HOLD is like pausing a video — when you press play again, it continues exactly where it left off. ON_ICE is like switching the TV off — when you turn it back on, it waits for the next scheduled programme, not the one you were watching.
ON_HOLD and ON_ICE are the two ways to suspend a job in AutoSys. They're often confused because both stop a job from running — but their release behaviour is completely different, and choosing the wrong one in a production recovery scenario can cause jobs to either run unexpectedly or not run until the next day. Get this distinction right.
Why ON_ICE Breaks Release Timing While ON_HOLD Doesn't
ON_HOLD and ON_ICE are both job-level conditions that prevent execution, but they differ in how they interact with time-based release logic. ON_HOLD is a simple binary gate: the job stays in a HOLD state until manually released, and when released, it respects all scheduling rules including start times. ON_ICE, however, is a state that cancels the job's current run window entirely. If a job is ON_ICE when its scheduled start time passes, that run is lost — the job will not execute until the next occurrence. This is the core mechanic: ON_ICE skips the current instance, ON_HOLD delays it. In practice, this means ON_ICE is useful for permanently skipping a single run without deleting the job definition, while ON_HOLD is for pausing execution without losing the scheduled trigger. The critical distinction is that ON_ICE does not queue a missed run — it simply discards it.
ON_HOLD — suspend and resume at current conditions
When a job is ON_HOLD, it is frozen in its current state. If you put a job on hold while its starting conditions were already met, releasing it (OFF_HOLD) will cause it to start immediately — the conditions are still true.
ON_ICE — suspend and wait for next condition cycle
When a job is ON_ICE, it's more deeply suspended. When you release it (OFF_ICE), the job does NOT start immediately — it waits for its conditions to become true in the next scheduling cycle.
For a job with start_times: '02:00', releasing it from ON_ICE at 3 AM means it won't run until the next scheduled 2 AM — it waits for the condition to reoccur, not to re-evaluate it as currently true.
Which to use when
The decision is simple once you understand the release behaviour:
Use ON_HOLD when: You want to delay a job temporarily and start it manually when ready. Maintenance windows. Jobs you want to run manually at a specific moment after releasing.
Use ON_ICE when: You want to skip a job for the current scheduling period and have it resume at its next normal scheduled time. Disabling a job for a few days without permanently modifying its definition. Safe suspension when you're not sure when you'll release it.
How ON_HOLD and ON_ICE affect dependencies
Both statuses affect downstream jobs that depend on the held/frozen job.
When a job is ON_HOLD, it cannot reach SUCCESS or FAILURE, so any downstream jobs that wait for it (via conditions) will remain in a pending state. Releasing from ON_HOLD will start the job, and once it completes, the downstream jobs will then run.
When a job is ON_ICE, same effect — it cannot complete, so dependents wait forever until the job is taken off ice and eventually runs.
The difference: if you put a job ON_HOLD and it already satisfied its own conditions, it will run immediately on release — downstream jobs start soon. If you put it ON_ICE, the job still needs to wait for its next condition cycle, so downstream jobs stay waiting longer.
Debugging jobs that won't start — hold/ice troubleshooting
When a job doesn't start and you suspect a hold or ice status, follow these steps:
- Run
autorep -J jobnameand look for ST column — OH or OI indicates the job is held/iced. - Check the status of any parent box:
autorep -J boxname— if the box is OH/OI, inner jobs are blocked even if they look normal. - Review
sendeventhistory to see who set the hold/ice: check autorep logs or event trail. - If a box is held and you release it, inner jobs might start immediately based on their own conditions — be cautious.
To clear a hold: sendevent -E JOB_OFF_HOLD -J jobname To clear ice: sendevent -E JOB_OFF_ICE -J jobname
The Silent Killer: How ON_ICE Masks Dependency Failures
You think ON_ICE is just a pause button. It's not. It's a time bomb for your dependency chain.
When you put a job ON_ICE, Autosys still evaluates its start conditions. It checks file triggers, time windows, and upstream job status. But instead of starting, it sits there — satisfied but silent. Every cycle, it re-evaluates. Every cycle, it finds the conditions met. Every cycle, it does nothing.
Meanwhile, the downstream jobs that depend on that box? They see it as "not running" — not failed, not success, just… nothing. So they wait. Forever. Unless you put them on a time-based override or manually intervene.
ON_HOLD doesn't have this problem. It never evaluates conditions. The job is frozen in time. Dependencies are explicitly broken until you release it. No ambiguity, no silent waits.
If you're debugging a chain where jobs won't start despite all conditions being green, check for ON_ICE. It's the job that's smiling and doing nothing.
Racing the Clock: Why ON_ICE Wrecks Scheduled Start Times
Here's the scenario: You have a job scheduled at 03:00, 06:00, 09:00. At 02:55, the upstream fails. You put it ON_ICE to debug. Problem solved, right? Wrong.
ON_ICE doesn't discard the missed start time. It holds the job in a state of 'conditions met, start time evaluated'. When you take it off ice at 10:00, Autosys says: "Last start condition matched at 09:00. That window is closed. You missed it." The job won't run until the next scheduled start — 03:00 tomorrow.
ON_HOLD is different. It never evaluates start times. When you release it at 10:00, Autosys checks: "Is it 10:00? Yes. Is conditions met? Check. Run." The job fires immediately if conditions are satisfied.
This is why release engineers hate ON_ICE during change windows. You're racing against the clock. Miss a start time, and you're waiting hours for the next cycle. With ON_HOLD, you control when it runs.
Rule: If you need to pause a time-critical batch and resume the same day, use ON_HOLD. If you're okay waiting for the next scheduled window, ON_ICE is fine.
Batch job ran at 3 AM instead of 2 AM because of ON_ICE misuse
sendevent -E JOB_OFF_ICE -J daily_settlement
2. Force a one-time run using sendevent -E JOB_ON_HOLD? Not possible while on ice. Instead, after OFF_ICE, manually trigger the job with sendevent -E FORCE_STARTJOB -J daily_settlement (if allowed) or wait for next scheduled run.
3. The real fix: use ON_HOLD for manual-release scenarios; ON_ICE only for skipping a period.- ON_ICE does NOT run the job immediately on release even if the scheduled window is past.
- Always ask: do we want this job to run now (ON_HOLD) or next period (ON_ICE)?
- Train your team on the difference — it's the #1 AutoSys interview question for a reason.
autorep -J <jobname> | grep STsendevent -E JOB_OFF_HOLD -J <jobname>Key takeaways
Common mistakes to avoid
4 patternsPutting a job ON_HOLD expecting it to wait until the next scheduled run
Putting a job ON_ICE when you need it to run manually after release
Forgetting a job is ON_ICE and wondering why it's not running for days
Using ON_HOLD on a box job without understanding it puts all inner jobs on hold too
Interview Questions on This Topic
What is the difference between ON_HOLD and ON_ICE 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