ON HOLD vs ON ICE in AutoSys — The Critical Difference
- ON_HOLD (OH): releasing runs the job immediately if conditions are currently met — use for manual-release scenarios
- ON_ICE (OI): releasing waits for conditions to reoccur in the next cycle — use for skipping the current run and resuming normally
- This is one of the most common AutoSys interview questions — the release behaviour difference is what matters
- 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
Hold/Ice Quick Debug Cheat Sheet
Job won't start — autorep shows OH
autorep -J <jobname> | grep STsendevent -E JOB_OFF_HOLD -J <jobname>Job won't start — autorep shows OI
autorep -J <jobname> | grep STsendevent -E JOB_OFF_ICE -J <jobname>Downstream pipeline blocked — no job in OH/OI visible
autorep -J <downstream_job> -qautorep -J <box_name> | head -20FORCE_STARTJOB does nothing
autorep -J <jobname> | grep STsendevent -E JOB_OFF_ICE -J <jobname>Production Incident
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.Production Debug GuideSymptom → Action for stuck jobs
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.
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.
# Put a job on hold sendevent -E JOB_ON_HOLD -J daily_report # Release from hold — starts immediately if conditions are met sendevent -E JOB_OFF_HOLD -J daily_report # Put an entire BOX on hold (and all inner jobs) sendevent -E JOB_ON_HOLD -J eod_processing_box # Check if a job is on hold autorep -J daily_report # shows OH status
daily_report OH -- <- ON_HOLD — conditions may already be met
/* After JOB_OFF_HOLD: */
/* If start_times was 02:00 and it's now 03:00 — job starts immediately */
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.
# Put a job on ice sendevent -E JOB_ON_ICE -J weekly_reconcile # Release from ice — waits for conditions to reoccur (next cycle) sendevent -E JOB_OFF_ICE -J weekly_reconcile # Check if a job is on ice autorep -J weekly_reconcile # shows OI status
weekly_reconcile OI -- <- ON_ICE
/* After JOB_OFF_ICE at 03:00 (job normally runs at 02:00): */
/* Job waits until NEXT scheduled 02:00 — does NOT run at 03:00 */
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.
# Scenario 1: Emergency maintenance, want to run job manually when done # Use ON_HOLD — releases will start immediately when ready sendevent -E JOB_ON_HOLD -J daily_settlement # ... do maintenance ... sendevent -E JOB_OFF_HOLD -J daily_settlement # starts now # Scenario 2: Job has a bug being fixed, skip today's run # Use ON_ICE — releases will wait for tomorrow's scheduled run sendevent -E JOB_ON_ICE -J daily_settlement # ... fix deployed by end of day ... sendevent -E JOB_OFF_ICE -J daily_settlement # runs tomorrow at 02:00 as normal
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.
# Job B depends on Job A autorep -J Job_B # Shows status: WAITING (because Job A is ON_HOLD or ON_ICE) # If Job A is ON_HOLD and you release it: sendevent -E JOB_OFF_HOLD -J Job_A # Job A runs now -> succeeds -> Job B starts # If Job A is ON_ICE and you release it: sendevent -E JOB_OFF_ICE -J Job_A # Job A waits until next scheduled time -> only then runs -> Job B waits even 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
# Check job status autorep -J daily_report # Output: ... ST: OH ... -> ON_HOLD # Check box status (inner jobs may be blocked) autorep -J batch_box # Check event history (if available) autorep -J daily_report -w -r # Force a job ON_HOLD if it's ON_ICE? Not possible directly; must clear ice first. sendevent -E JOB_OFF_ICE -J daily_report # Then optionally set hold: sendevent -E JOB_ON_HOLD -J daily_report
| Aspect | ON_HOLD (OH) | ON_ICE (OI) |
|---|---|---|
| Status code | OH | OI |
| How to set | sendevent -E JOB_ON_HOLD | sendevent -E JOB_ON_ICE |
| How to release | sendevent -E JOB_OFF_HOLD | sendevent -E JOB_OFF_ICE |
| After release behaviour | Starts immediately if conditions currently met | Waits for conditions to reoccur in next cycle |
| Use case | Temporary hold, manual release when ready | Skip current period, resume at next scheduled time |
| Risk if misused | Job starts unexpectedly after release | Job misses current run entirely |
| Impact on dependencies | Downstream jobs blocked until held job completes | Same, but release delay may be longer (next cycle) |
| Can FORCE_STARTJOB override? | Often yes (depending on version) | Usually no — must release ice first |
🎯 Key Takeaways
- ON_HOLD (OH): releasing runs the job immediately if conditions are currently met — use for manual-release scenarios
- ON_ICE (OI): releasing waits for conditions to reoccur in the next cycle — use for skipping the current run and resuming normally
- This is one of the most common AutoSys interview questions — the release behaviour difference is what matters
- Setting a box ON_HOLD also holds all inner jobs; same for ON_ICE
- Always check parent box status when debugging stuck jobs — OH/OI on the box blocks everything inside
⚠ Common Mistakes to Avoid
Interview Questions on This Topic
- QWhat is the difference between ON_HOLD and ON_ICE in AutoSys?JuniorReveal
- QIf you release a job from ON_HOLD at 3 AM when its scheduled time was 2 AM, what happens?JuniorReveal
- QIf you release a job from ON_ICE at 3 AM when its scheduled time was 2 AM, what happens?JuniorReveal
- QWhen would you use ON_ICE instead of ON_HOLD?Mid-levelReveal
- QWhat AutoSys status code represents ON_HOLD and ON_ICE?JuniorReveal
- QCan you FORCE_STARTJOB a job that is ON_ICE?SeniorReveal
Frequently Asked Questions
What is the difference between ON_HOLD and ON_ICE in AutoSys?
When you release a job from ON_HOLD, it starts immediately if its starting conditions are currently met. When you release from ON_ICE, it waits for conditions to reoccur in the next scheduling cycle — it won't start immediately even if conditions are true.
Which is safer to use — ON_HOLD or ON_ICE?
ON_ICE is generally safer when you want to skip a current run and resume normally. ON_HOLD is better when you plan to manually trigger the job as soon as the hold is released. The choice depends on your intent.
Can you FORCE_STARTJOB a job that is ON_ICE?
In most AutoSys versions, you cannot force-start a job that is ON_ICE. You must first take it off ice, then force-start it. This is different from ON_HOLD, where a force-start event can often override the hold.
Does putting a BOX on hold affect the jobs inside?
Yes. When a BOX job is placed ON_HOLD or ON_ICE, the box cannot enter RUNNING state, so none of its inner jobs can start. The hold effectively applies to the entire box contents.
What is the status code for ON_HOLD and ON_ICE in autorep?
ON_HOLD shows as OH in autorep status output. ON_ICE shows as OI.
How do I check event history to see who put a job on hold?
Use autorep -J jobname -w -r to view event history. You can also check AutoSys logs or the database table view UJO_EVENT if you have access.
Developer and founder of TheCodeForge. I built this site because I was tired of tutorials that explain what to type without explaining why it works. Every article here is written to make concepts actually click.