Cron is the Unix job scheduler. A cron expression is the schedule — five fields, separated by spaces, evaluated every minute by the cron daemon to decide whether to fire each job. The generator above builds the expression from a chosen schedule; this page explains what each field does so you can read and modify the result.
The five fields
┌───────── minute (0–59)
│ ┌─────── hour (0–23)
│ │ ┌───── day-of-month (1–31)
│ │ │ ┌─── month (1–12 or JAN–DEC)
│ │ │ │ ┌─ day-of-week (0–6 or SUN–SAT; some systems also accept 7 = SUN)
│ │ │ │ │
* * * * * command
The cron daemon checks the current time each minute and runs the command if all five fields match. * * * * * matches every minute of every hour of every day, etc.
Field syntax
Each field accepts the same set of operators:
| Operator | Meaning | Example |
|---|---|---|
* | every value in range | * in minute = every minute |
, | list | 0,15,30,45 = at minutes 0, 15, 30, 45 |
- | inclusive range | 9-17 in hour = 9 AM through 5 PM |
/ | step | */5 in minute = every 5 minutes |
| combined | range with step | 0-30/10 in minute = at 0, 10, 20, 30 |
Common schedules read aloud
*/5 * * * * every 5 minutes
0 * * * * at the top of every hour
0 0 * * * at midnight every day
0 9 * * 1-5 at 9 AM on weekdays
0 0 1 * * at midnight on the first of every month
0 0 * * 0 at midnight on Sunday
30 2 * * * at 2:30 AM every day
0 */6 * * * every 6 hours
15,45 * * * * at :15 and :45 of every hour
If you cannot read a schedule at a glance, paste it into the cron expression parser — it explains the schedule in plain English.
The day-of-month / day-of-week trap
The most common cron mistake. When both day-of-month and day-of-week are specified (neither is *), most cron implementations treat them as OR, not AND. So:
0 0 1 * 1
Reads as “midnight on either the 1st of the month OR every Monday” — not “midnight on the 1st only when the 1st is a Monday.” If you want AND semantics (a specific date that’s also a specific weekday), cron alone can’t express it; you have to script the weekday check inside the job.
Vixie cron, the dominant Unix implementation, documents this as the OR rule. Some scheduler reimplementations differ — check the docs of the system that’s actually running your jobs.
Special strings
Many cron implementations accept these shortcuts in place of the five fields:
| Shortcut | Equivalent |
|---|---|
@yearly / @annually | 0 0 1 1 * |
@monthly | 0 0 1 * * |
@weekly | 0 0 * * 0 |
@daily / @midnight | 0 0 * * * |
@hourly | 0 * * * * |
@reboot | once at daemon startup |
@reboot is the only shortcut that doesn’t map to a five-field expression — it’s a different trigger entirely. Not all schedulers support these (notably some cloud-platform cron-likes don’t), so the explicit five-field form is the more portable choice.
Timezone
Cron evaluates against the system clock of the machine running the daemon. A job scheduled 0 9 * * * runs at 9 AM local time on that host. After daylight-saving transitions, the wall-clock time stays consistent, but the UTC offset shifts by an hour — relevant if downstream consumers expect a fixed UTC offset.
Modern reimplementations (systemd timers, cloud schedulers, Kubernetes CronJobs) often let you specify a timezone explicitly. Classic Unix cron does not.
Where cron isn’t enough
- Sub-minute schedules. Cron’s minimum granularity is one minute. Anything finer needs a different scheduler (a daemon, a job queue, a process manager).
- Once-off scheduling.
atis the Unix tool for “run this once at 3 PM tomorrow.” Cron is for recurring jobs. - Distributed coordination. If two hosts have the same crontab, both run the job. Use a leader-election lock or a distributed scheduler to fire exactly once across a cluster.
- Long-running jobs. Cron fires every minute; if a job runs longer than its interval, you’ll get overlapping runs. Wrap with
flockor set the job to no-op when its predecessor is still running.
Related schedules with their own pages
For specific common schedules, see the dedicated pages: every minute, every 5 minutes, every 15 minutes, every 30 minutes, every hour, daily, weekly, monthly. To reverse the process — read an existing schedule out loud — use the cron expression parser.