How the builder works
Each of the five cron fields has its own control. Every writes *. Every N writes a step such as */15. From–to writes a range such as 9-17. Specific lets you tick individual values, which are written as a list (1,15) or collapsed into a range when they are consecutive (1-5). The expression at the top updates as you go, together with a plain-English reading and the next five run times.
You can also type into the expression box directly. Edits there are evaluated immediately but do not rewrite the form, so an expression the form cannot represent (for example 8-18/2) is kept as you typed it.
Reading the result
*/15 9-17 * * 1-5
│ │ │ │ └── Monday to Friday
│ │ │ └──── every month
│ │ └────── every day of the month
│ └─────────── 09:00 to 17:59
└──────────────── every 15 minutes
This runs at :00, :15, :30 and :45 of every hour from 9 to 17 on weekdays, so the last run of the day is 17:45.
Schedules people build most often
| Schedule | Expression |
|---|---|
| Every minute | * * * * * |
| Every 5 minutes | */5 * * * * |
| Every hour, on the hour | 0 * * * * |
| Every day at 02:30 | 30 2 * * * |
| Weekdays at 09:00 | 0 9 * * 1-5 |
| Twice a day, 06:00 and 18:00 | 0 6,18 * * * |
| Every Sunday at midnight | 0 0 * * 0 |
| First day of every month | 0 0 1 * * |
| Last day of the month | Not expressible in standard cron. Run daily and test [ "$(date -d tomorrow +\%d)" = 01 ] in the command. |
| Every quarter (Jan, Apr, Jul, Oct 1st) | 0 0 1 1,4,7,10 * |
Things the five fields cannot say
- Seconds. Standard cron's resolution is one minute. If you need sub-minute scheduling, loop inside the job or use a different scheduler.
- Intervals that do not divide the field.
*/7 * * * *runs at 0, 7, 14 … 56 and then again at 0, not 63. Every 90 minutes needs two lines:0 0-23/3 * * *and30 1-23/3 * * *. - “Last Friday”, “second Tuesday”. Quartz has
Land#for these; classic cron does not. - Day-of-month AND day-of-week. When both are set, cron matches either. See the parser page for the workaround.
Installing the schedule
# Open your crontab in an editor
crontab -e
# Add a line: schedule, then the command. Use absolute paths.
*/15 9-17 * * 1-5 /usr/local/bin/sync-reports >> /var/log/sync.log 2>&1
Kubernetes CronJob, GitHub Actions on.schedule.cron and most cloud schedulers accept the same five-field string. GitHub Actions runs schedules in UTC; Kubernetes uses the controller's timezone unless timeZone is set.