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-5 | Every 15 minutes, between 09:00 and 17:59, Monday through Friday. |
Hours
| Every hour | 0 * * * * | Every hour, on the hour. |
| Every hour at half past | 30 * * * * | Every hour at 30 minutes past (xx:30). |
| Every 2 hours | 0 */2 * * * | Every 2 hours at minute 0, from 00:00 to 22:00. |
| Every 3 hours | 0 */3 * * * | Every 3 hours at minute 0, from 00:00 to 21:00. |
| Every 4 hours | 0 */4 * * * | At 00:00, 04:00, 08:00, 12:00, 16:00 and 20:00, every day. |
| Every 5 hours | 0 */5 * * * | At 00:00, 05:00, 10:00, 15:00 and 20:00, every day. |
| Every 6 hours | 0 */6 * * * | At 00:00, 06:00, 12:00 and 18:00, every day. |
| Every 8 hours | 0 */8 * * * | At 00:00, 08:00 and 16:00, every day. |
| Every 12 hours | 0 */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 hours | 0 9-17 * * 1-5 | Every hour at minute 0, from 09:00 through 17:00, Monday through Friday. |
Daily
| Every day at midnight | 0 0 * * * | At 00:00, every day. |
| Every day at 1 AM | 0 1 * * * | At 01:00, every day. |
| Every day at 2 AM | 0 2 * * * | At 02:00, every day. |
| Every day at 3 AM | 0 3 * * * | At 03:00, every day. |
| Every day at 6 AM | 0 6 * * * | At 06:00, every day. |
| Every day at 9 AM | 0 9 * * * | At 09:00, every day. |
| Every day at noon | 0 12 * * * | At 12:00, every day. |
| Every day at 6 PM | 0 18 * * * | At 18:00, every day. |
| Every other day | 0 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-5 | At 09:00, Monday through Friday. |
| Every weekend (Saturday and Sunday) | 0 10 * * 6,0 | At 10:00, on Saturday and Sunday. |
| Every Monday | 0 9 * * 1 | At 09:00, on Monday. |
| Every Friday | 0 17 * * 5 | At 17:00, on Friday. |
| Every Sunday | 0 3 * * 0 | At 03:00, on Sunday. |
| Once a week | 0 0 * * 0 | At 00:00, on Sunday. |
| Every 2 weeks | 0 9 * * 1 | At 09:00, on Monday. needs a guard |
Monthly
| First day of every month | 0 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 month | 0 23 28-31 * * | At 23:00, on days 28 through 31 of the month. needs a guard |
| First Monday of the month | 0 9 1-7 * * | At 09:00, on days 1 through 7 of the month. needs a guard |
| Every quarter | 0 0 1 1,4,7,10 * | At 00:00, on the 1st of the month, in January, April, July and October. |
| Every 6 months | 0 0 1 1,7 * | At 00:00, on the 1st of the month, in January and July. |
| Once a year | 0 0 1 1 * | At 00:00, on the 1st of the month, in January. |
Cron syntax in one table
| Field | Allowed | Notes |
|---|---|---|
| minute | 0-59 | */15 = 0, 15, 30, 45 |
| hour | 0-23 | Server's local time unless the scheduler has a timezone setting |
| day of month | 1-31 | No "last day" in standard cron; L is Quartz-only |
| month | 1-12, JAN-DEC | Names are case-insensitive |
| day of week | 0-7, SUN-SAT | 0 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
Monitor cron jobs free
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.
Free plan, no card. Alerts on email, Telegram, Slack, Discord, Teams or any webhook.