Cron Explainer

Paste a cron expression to see when it runs in plain English.

How to read a cron expression

Five fields, space-separated: minute hour day-of-month month day-of-week. Symbols: * = every, */n = every n, a,b,c = list, a-b = range. Need to build one instead? Use the Cron Expression Generator.

FieldValuesNotes
Minute0–59Smallest unit standard cron understands
Hour0–2324-hour clock; 0 is midnight
Day of month1–31Months are not all the same length — day 31 silently skips short months
Month1–12Most implementations also accept JANDEC
Day of week0–60 is Sunday; many crons also accept 7 for Sunday and SUNSAT

Expressions worth recognising

ExpressionRuns
0 * * * *Every hour, on the hour
*/5 * * * *Every five minutes
0 9 * * 1-509:00, Monday to Friday
30 2 * * 002:30 every Sunday
0 0 1 * *Midnight on the first of each month
0 0 1 1 *Midnight on 1 January

Three things that catch people out

Day-of-month and day-of-week are combined with OR, not AND. When both fields are restricted, the job runs if either matches. 0 0 13 * 5 does not mean "Friday the 13th" — it means "every 13th, and also every Friday". To target one specific weekday, leave day-of-month as *.

Steps count from the start of the field, not from when you install the job. */20 * * * * fires at :00, :20 and :40 — not twenty minutes from now. And because the counter resets each hour, */45 fires at :00 and :45, leaving a 15-minute gap rather than a 45-minute one.

Cron uses the server's clock and never makes up a missed run. If the machine is off or asleep at the scheduled minute, that occurrence is simply skipped. On days when clocks shift for daylight saving, a job scheduled inside the skipped hour may not run at all, and one inside the repeated hour may run twice — behaviour varies by implementation.

FAQ

Does cron support seconds?

Standard Unix cron resolves to the minute. Expressions with six or seven fields — a leading seconds column, and sometimes a trailing year — come from Quartz, Spring and some CI schedulers. Pasting one of those into a normal crontab shifts every field by one position, which usually produces a valid but wrong schedule.

What do @daily and @reboot mean?

Shortcuts accepted by most crons: @yearly, @monthly, @weekly, @daily (midnight), @hourly, and @reboot, which runs once when the machine starts rather than on a schedule. They are convenient but not universally supported — managed schedulers often reject them.

My schedule looks right but the job never ran.

The usual causes are not in the expression. Cron runs with a minimal environment, so commands need absolute paths and cannot rely on your shell profile. Output goes nowhere unless redirected, which hides errors. The server may be in UTC while you were thinking in local time. And a crontab file whose last line has no trailing newline can be ignored entirely.