Cron: every hour
The minute field is fixed at 0 and every other field is open, so the job runs on the hour, 24 times a day. @hourly is a shorthand for exactly this.
Open in Cron Parser The expression is filled in: change it and watch the next runs.
Expression
0 * * * * Meaning
At minute 0 of every hour
Next 5 runs
Your time zone
The same schedule on other platforms
| Platform | Written as | Note |
|---|---|---|
| Linux crontab | 0 * * * * | Five fields, in the server's local time zone. A % in the command has to be escaped as \%. |
| GitHub Actions | - cron: '0 * * * *' | Five fields, in UTC unless a timezone (an IANA name such as Europe/Warsaw) is set next to cron. Default branch only. The shortest interval is 5 minutes; when GitHub is busy, runs start late and some are dropped. |
| Kubernetes CronJob | schedule: "0 * * * *" | Five fields, in the controller's time zone unless spec.timeZone is set (Kubernetes 1.27 and later). concurrencyPolicy decides what happens when runs overlap. |
| systemd timer | OnCalendar=hourly | Its own calendar syntax, in a .timer unit, local time. hourly, daily and monthly match cron, but weekly means Monday. Persistent=true catches up on runs missed while the machine was off. |
| AWS EventBridge | cron(0 * * * ? *) | Or rate(1 hour), which counts from when the rule was created instead of the top of the hour. |
| Quartz / Spring | 0 0 * * * ? | Six fields, seconds first. Quartz needs ? in one of the day fields and counts Sunday as 1; Spring accepts ? and numbers days like cron. |
Common mistakes
* 1 * * *is not hourlyIt runs every minute from 01:00 to 01:59: sixty runs, once a day. The minute has to be fixed for an hourly job.
The top of the hour is crowded
Log rotation, backups and every other hourly job start at :00. A fixed odd minute, such as
17 * * * *, spreads the load.On GitHub, :00 is the busiest minute
Scheduled workflows queue up at the top of the hour. Another minute gets your run started sooner.