Free tools

Cron schedule examples

45 common schedules, each with the exact expression, what it means, when it runs next, the mistakes people make with it, and the systemd timer, Kubernetes CronJob and GitHub Actions versions.

Minutes

Every minute* * * * *Every minute.
Every 30 seconds* * * * *Every minute. needs a guard
Every 2 minutes*/2 * * * *Every 2 minutes.
Every 3 minutes*/3 * * * *Every 3 minutes.
Every 5 minutes*/5 * * * *Every 5 minutes.
Every 7 minutes*/7 * * * *Every 7 minutes.
Every 10 minutes*/10 * * * *Every 10 minutes.
Every 15 minutes*/15 * * * *Every 15 minutes.
Every 20 minutes*/20 * * * *Every 20 minutes.
Every 30 minutes*/30 * * * *Every 30 minutes.
Every 15 minutes during business hours*/15 9-17 * * 1-5Every 15 minutes, between 09:00 and 17:59, Monday through Friday.

Hours

Every hour0 * * * *Every hour, on the hour.
Every hour at half past30 * * * *Every hour at 30 minutes past (xx:30).
Every 2 hours0 */2 * * *Every 2 hours at minute 0, from 00:00 to 22:00.
Every 3 hours0 */3 * * *Every 3 hours at minute 0, from 00:00 to 21:00.
Every 4 hours0 */4 * * *At 00:00, 04:00, 08:00, 12:00, 16:00 and 20:00, every day.
Every 5 hours0 */5 * * *At 00:00, 05:00, 10:00, 15:00 and 20:00, every day.
Every 6 hours0 */6 * * *At 00:00, 06:00, 12:00 and 18:00, every day.
Every 8 hours0 */8 * * *At 00:00, 08:00 and 16:00, every day.
Every 12 hours0 */12 * * *At 00:00 and 12:00, every day.
Twice a day (09:00 and 21:00)0 9,21 * * *At 09:00 and 21:00, every day.
Every hour during business hours0 9-17 * * 1-5Every hour at minute 0, from 09:00 through 17:00, Monday through Friday.

Daily

Every day at midnight0 0 * * *At 00:00, every day.
Every day at 1 AM0 1 * * *At 01:00, every day.
Every day at 2 AM0 2 * * *At 02:00, every day.
Every day at 3 AM0 3 * * *At 03:00, every day.
Every day at 6 AM0 6 * * *At 06:00, every day.
Every day at 9 AM0 9 * * *At 09:00, every day.
Every day at noon0 12 * * *At 12:00, every day.
Every day at 6 PM0 18 * * *At 18:00, every day.
Every other day0 0 */2 * *At 00:00, on every 2nd day of the month (1st, 3rd, 5th … 31st).

Weekly

Every weekday (Monday to Friday)0 9 * * 1-5At 09:00, Monday through Friday.
Every weekend (Saturday and Sunday)0 10 * * 6,0At 10:00, on Saturday and Sunday.
Every Monday0 9 * * 1At 09:00, on Monday.
Every Friday0 17 * * 5At 17:00, on Friday.
Every Sunday0 3 * * 0At 03:00, on Sunday.
Once a week0 0 * * 0At 00:00, on Sunday.
Every 2 weeks0 9 * * 1At 09:00, on Monday. needs a guard

Monthly

First day of every month0 0 1 * *At 00:00, on the 1st of the month.
Twice a month (1st and 15th)0 0 1,15 * *At 00:00, on the 1st and 15th of the month.
Last day of the month0 23 28-31 * *At 23:00, on days 28 through 31 of the month. needs a guard
First Monday of the month0 9 1-7 * *At 09:00, on days 1 through 7 of the month. needs a guard
Every quarter0 0 1 1,4,7,10 *At 00:00, on the 1st of the month, in January, April, July and October.
Every 6 months0 0 1 1,7 *At 00:00, on the 1st of the month, in January and July.
Once a year0 0 1 1 *At 00:00, on the 1st of the month, in January.

Cron syntax in one table

FieldAllowedNotes
minute0-59*/15 = 0, 15, 30, 45
hour0-23Server's local time unless the scheduler has a timezone setting
day of month1-31No "last day" in standard cron; L is Quartz-only
month1-12, JAN-DECNames are case-insensitive
day of week0-7, SUN-SAT0 and 7 are both Sunday; if both day fields are restricted, either may match

Operators: * any value · , list · - range · / step. Macros: @hourly @daily @weekly @monthly @yearly @reboot.

Mistakes that bite every cron user eventually

Server timezone. cron uses the machine's local timezone, and most cloud VMs and containers are set to UTC. Check with timedatectl or date. cronie (RHEL, Fedora, Arch) accepts CRON_TZ=Asia/Kolkata at the top of a crontab; Debian/Ubuntu cron does not.
Daylight saving time. On DST days, local times around 01:00-03:00 are skipped or repeated. Vixie cron/cronie try to run skipped fixed-time jobs just after the jump and not twice in the repeated hour; Kubernetes, systemd and most libraries behave differently. Schedule in UTC if 'exactly once' matters.
Day-of-month OR day-of-week. If both the 3rd and 5th fields are restricted, cron runs when either matches: 0 0 13 * 5 runs on every 13th and every Friday, not only on Friday the 13th.
Unescaped %. In a crontab line, % is turned into a newline (everything after it goes to the command's stdin). Write date +\%F, not date +%F.
A different environment. cron runs with a minimal PATH (often just /usr/bin:/bin), no login shell and no .bashrc. Use absolute paths and set variables at the top of the crontab.
Silent failures. cron doesn't tell anyone when a job fails or stops running; output goes to local mail nobody reads. A heartbeat monitor that expects a ping after every run is the only reliable way to notice.
How Vigil can watch this for you

Get alerted when a scheduled job doesn't run

Every schedule on this page can be a Vigil heartbeat: add one curl to the end of the command, give Vigil the cron expression and timezone, and it alerts you when a run is missed, fails or hangs.

Monitor cron jobs free
Free plan, no card. Alerts on email, Telegram, Slack, Discord, Teams or any webhook.
More free tools: