0 * * * *Fields
| Minute | 0 | 0 |
|---|---|---|
| Hour | * | any |
| Day of month | * | any |
| Month | * | any |
| Day of week | * | any |
Where to use it
| crontab | 0 * * * * /path/to/script.sh |
|---|---|
| GitHub Actions | - cron: "0 * * * *" (on.schedule) |
| Kubernetes CronJob | schedule: "0 * * * *" |
crontab runs in the server’s time zone; GitHub Actions always uses UTC.
Good to know
0 * * * * runs at the top of every hour, the same as @hourly. A common slip is putting the 0 in the hour field: * 0 * * * runs every minute from 00:00 to 00:59. Debian and Ubuntu also run scripts in /etc/cron.hourly at minute 17 via run-parts, which suits jobs that don’t care about the exact minute. Every 2 hours is 0 */2 * * *.
Minute 0 is the busiest moment for every scheduler, so for jobs that call shared services pick another minute, such as 23 * * * *. GitHub Actions warns that runs at the start of the hour are often delayed or even dropped under load. If a run can exceed an hour, wrap it in flock -n, and append output to a log so failures leave a trace.