Control-M for Beginners: Jobs, Folders, Conditions & New Day Explained
Control-M beginner tutorial: learn how jobs, folders, conditions, and the New Day actually work in production—with real war stories and fixes.
20+ years shipping production infrastructure and CI/CD at scale. Drawn from code that ran under real load.
- ✓Basic familiarity with what a scheduled task or cron job is
- ✓Comfort with the idea of a batch process (e.g., a nightly script that moves files)
- ✓No prior Control-M experience required
Control-M schedules and orchestrates batch jobs across servers, databases, and applications. You define jobs inside folders, link them with conditions (like 'job A must finish before job B starts'), and the New Day process rolls the schedule forward each day so the same workflow runs reliably without manual intervention.
Think of Control-M as an air traffic control tower for your nightly batch processes. Jobs are the planes, folders are the flight paths grouped by destination, conditions are the radio calls that say 'I've landed, you're cleared to take off,' and the New Day is the daily shift change where the tower resets the board for tomorrow's flights. Without the tower, planes would take off whenever they want and crash into each other.
Most Control-M tutorials start with a definition and end with a screenshot of the GUI. That's why beginners still can't explain why their job didn't run at 2 AM. The truth: Control-M is not a cron replacement—it's a dependency engine, and if you don't understand conditions and the New Day, you're just guessing.
Here's the problem it solves: in a real enterprise, you have hundreds of jobs that must run in a specific order across different servers, databases, and time zones. Cron can't handle 'wait for the file to arrive, then run the load, then trigger the report only if the load succeeded.' Control-M can. It's the difference between a to-do list and a project plan with dependencies.
After this article, you'll be able to read a Control-M job flow, explain why a job is waiting, create a folder with conditions, and understand what happens when the New Day rolls over. You'll also know the exact mistakes that cause jobs to hang forever—and how to fix them.
Jobs: The Atoms of Control-M
A job is the smallest unit of work in Control-M. It's a command, a script, a database procedure—anything that can run on a server. But unlike cron, a Control-M job carries metadata: what conditions it needs, what conditions it sets, what to do on failure, and which folder it belongs to. That metadata is what turns a dumb script into a schedulable, observable unit.
In production, jobs are rarely standalone. A typical nightly batch has a job that extracts data, one that transforms it, and one that loads it. Each job is a separate entity, but they're linked by conditions. The job itself doesn't know about the others—Control-M orchestrates the flow.
Folders: Grouping Jobs for Sanity and Control
A folder is a container for jobs. It's the equivalent of a project folder in your IDE—except it also carries scheduling and dependency rules. Folders let you group related jobs (e.g., all finance jobs), set a common schedule (e.g., run every weekday at 1 AM), and define folder-level conditions that apply to all jobs inside.
Why folders matter: without them, you'd have hundreds of loose jobs with no structure. Folders give you a single point of control. Need to disable all finance jobs for a holiday? Disable the folder. Need to set a condition that all jobs in the folder must wait for? Set it at the folder level. It's the difference between managing a team and managing a crowd.
BATCH_WINDOW_OPEN only after your upstream data provider confirms the file is ready. Then every job in the folder automatically waits—no need to add the condition to each job individually.Conditions: The Glue That Holds Workflows Together
Conditions are the heart of Control-M. They're boolean flags—either set or not set—that jobs use to communicate. A job can wait for one or more conditions (in-conditions) and set one or more conditions when it finishes (out-conditions). This is how you build dependencies without hardcoding job names.
The problem conditions solve: in a cron world, you'd schedule job B at 2 AM hoping job A finishes by then. If A runs long, B fails or runs on stale data. With conditions, B waits until A explicitly says 'I'm done' by setting a condition. It's event-driven scheduling, not time-based guessing.
onFailure: DO_NOT_SET), downstream jobs will run on bad data. Always tie out-conditions to job success.The New Day: Resetting the Clock Without Losing Your Mind
The New Day is Control-M's daily reset. At a configured time (usually midnight or early morning), Control-M rolls the schedule forward: it clears old conditions, resets job statuses, and prepares the next day's run. Without it, jobs would only run once and then sit in 'Completed' forever.
The New Day is also the source of many beginner headaches. If it fails or is delayed, all jobs for the new day stay in 'Wait Schedule' and nothing runs. If it runs twice, you get duplicate jobs. Understanding the New Day is non-negotiable for anyone operating Control-M in production.
Putting It All Together: A Realistic Nightly Batch
Let's walk through a realistic finance batch: a file arrives from the billing system, you extract it, transform it, load it into the warehouse, and generate a report. Each step is a job, grouped in a folder, linked by conditions, and reset daily by the New Day.
This is the pattern you'll see in 80% of enterprise Control-M setups. Master this, and you can read any job flow.
Common Beginner Mistakes (And How to Avoid Them)
Most Control-M failures aren't complex—they're simple mistakes repeated. Here are the ones I see most often, with exact fixes.
EXTRACT_DONE, jobs in one folder might trigger jobs in the other. Always namespace your conditions: FOLDERNAME_CONDITIONNAME.The Condition That Never Came
DAILY_LOAD_OK had been disabled by a well-meaning admin who thought it was a duplicate. The condition was never set, so the report job waited forever. Control-M doesn't time out conditions by default—it waits indefinitely.- A condition is a promise.
- If the promiser is gone, the promise never resolves—and Control-M will wait until the heat death of the universe.
ctmcontb -LIST <condition_name> "*". 2. If condition not set, find producer job and check its status/log. 3. If producer failed, fix and rerun. 4. If producer was deleted, manually set condition: ctmcontb -ADD <condition_name> <MMDD> or add dummy job.$CONTROLM_HOME/log/newday.log.ctmcontb -LIST "" "". 2. Check the job's scheduling criteria and whether it was ordered more than once (e.g. via ctmpsm or the Monitoring domain). 3. Ensure the job is ordered only once per day. 4. If duplicate output, clean up manually and add pre-run check script.ctmcontb -LIST "" "". 2. Delete condition: ctmcontb -DELETE <condition_name> <date>. 3. Add dummy job to set condition or fix dependency chain.ctmcontb -LIST <condition_name> "*"ctmpsm (no arguments, interactive menu) | grep <producer_job_name>ctmcontb -ADD <condition_name> <MMDD>.| File | Command / Code | Purpose |
|---|---|---|
| DailyRevenueExtract.devops | { | Jobs |
| FinanceDailyFolder.devops | { | Folders |
| ConditionFlow.devops | { | Conditions |
| NewDayConfig.devops | { | The New Day |
| FinanceBatchFlow.devops | { | Putting It All Together |
Key takeaways
FINANCE_EXTRACT_DONE is safer than EXTRACT_DONE.Interview Questions on This Topic
How does Control-M handle a condition that is set by multiple jobs?
Frequently Asked Questions
20+ years shipping production infrastructure and CI/CD at scale. Drawn from code that ran under real load.
That's Control-M. Mark it forged?
3 min read · try the examples if you haven't