Cron Expressions Explained: How to Read and Write Any Cron Schedule
A cron expression is five fields separated by spaces: minute, hour, day of month, month, and day of week. An asterisk means "every." So */5 * * * * reads as "every 5 minutes," and 0 9 * * 1-5 reads as "at 9:00am, Monday through Friday." That is genuinely all there is to it — the rest of this guide is the field-by-field detail, the schedules everyone actually uses, and the gotchas that make cron jobs silently misfire.
If you'd rather click than memorize, the free Cron Expression Builder builds and explains expressions in plain English as you type. It runs entirely in your browser.
The Five Fields
| Position | Field | Allowed values | Example |
|---|---|---|---|
| 1 | Minute | 0–59 | 30 = at :30 |
| 2 | Hour | 0–23 | 14 = 2pm |
| 3 | Day of month | 1–31 | 1 = the 1st |
| 4 | Month | 1–12 or JAN–DEC | 6 = June |
| 5 | Day of week | 0–6 or SUN–SAT (0 = Sunday) | 1-5 = weekdays |
Each field also accepts four operators:
*— every value ("every minute," "every month"),— a list:0,30in the minute field = at :00 and :30-— a range:9-17in the hour field = 9am through 5pm*/n— a step:*/15in the minute field = every 15 minutes
The Schedules Everyone Actually Uses
| Expression | Plain English |
|---|---|
* * * * * | Every minute |
*/5 * * * * | Every 5 minutes |
*/15 * * * * | Every 15 minutes |
0 * * * * | Every hour, on the hour |
0 */6 * * * | Every 6 hours (midnight, 6am, noon, 6pm) |
0 0 * * * | Every day at midnight |
0 9 * * 1-5 | Weekdays at 9:00am |
0 0 * * 0 | Every Sunday at midnight |
0 0 1 * * | First of every month at midnight |
0 3 * * 6 | Saturdays at 3:00am (classic backup slot) |
Need one that is not on the list? Open the Cron Expression Builder, click the schedule together, and copy the result — it shows a live plain-English readout so you can sanity-check before you ship it.
How to Read an Unfamiliar Expression (Step by Step)
Split it into the five fields
Take 30 2 * * 1 and label each position: minute=30, hour=2, day-of-month=*, month=*, day-of-week=1.
Read time fields first, calendar fields second
Minute 30, hour 2 → "at 2:30am." Day-of-month and month are both * → "any date." Day-of-week 1 → "on Mondays."
Combine: "At 2:30am every Monday"
If both day-of-month AND day-of-week are restricted (neither is *), classic cron runs when either matches — a famous gotcha. 0 0 13 * 5 fires on the 13th of the month and on every Friday, not just Friday the 13th.
The Gotchas That Bite People
- Minimal environment. Cron does not load your shell profile.
node,python, or anything installed via a version manager may not be on PATH. Use absolute paths:/usr/bin/python3 /home/app/job.py. - Silent failures. By default output goes nowhere useful. Append
>> /var/log/myjob.log 2>&1so you can actually see what happened. - Timezones. The server's clock decides when "9am" is. Cloud schedulers (GitHub Actions, most CI) run in UTC unless told otherwise.
- The OR rule. Restricting both day-of-month and day-of-week matches either one, not both (see step 3 above).
- Six-field variants. Some systems (Quartz, certain cloud schedulers) put seconds first, making six or seven fields. If your five-field expression is rejected, check whether the platform expects a seconds field.
Frequently Asked Questions
What does * * * * * mean in cron?
Run every minute, of every hour, of every day, of every month, on every day of the week — 1,440 runs per day. It is the most permissive expression possible.
How do I run a cron job every 5 minutes?
Use */5 * * * *. The */5 step in the minute field fires at :00, :05, :10, and so on, every hour of every day.
Is day-of-week 0 Sunday or Monday?
0 is Sunday in standard cron, and most implementations also accept 7 for Sunday. Monday is 1. Many systems accept names like MON and FRI, which are much easier to read in six months.
What timezone do cron jobs run in?
Classic crontab uses the server's local timezone. GitHub Actions and most CI systems use UTC. A "9am" job scheduled in UTC fires at 1am Pacific — always confirm which clock your scheduler reads.
Why does my cron job run but do nothing?
Almost always environment: cron runs with a minimal PATH and no shell profile, so commands that work in your terminal fail silently. Use absolute paths everywhere and redirect output to a log file to surface the actual error.
Build a Cron Expression Now
Click the schedule together and copy the expression — with a live plain-English readout. Free, no sign-up, runs in your browser.
Open Cron Expression Builder