/

Cron: Every Hour

0 * * * * runs once an hour, on the hour — at :00 of every hour, every day. It's the classic default for jobs that need regular but not aggressive freshness: log rotation, moderate data syncs, and periodic cleanup tasks.

Examples & Variations

0 * * * *

Every hour, on the hour

Try it

30 * * * *

Every hour, at :30 instead

Try it

0 9-17 * * 1-5

Every hour, business hours only

Try it

Common Mistakes

  • Writing * * * * * (every minute) when you meant every hour — a single field mistake changes the frequency by 60x.
  • Assuming "every hour" and "every 60 minutes" are the same thing — 0 * * * * always fires on the hour mark, while a literal 60-minute interval from an arbitrary start time would drift relative to the clock.
  • Not considering timezone: an hourly job on a server set to UTC will fire at different local times than one on a server in local time, which matters for anything user-facing.

Best Practices

  • Hourly is the standard interval for log rotation (logrotate defaults to this cadence) and works well for most periodic maintenance tasks.
  • If exact minute doesn't matter, avoid clustering every hourly job at :00 — spreading them across the hour (0, 15, 30, 45 for different jobs) reduces simultaneous load spikes.
  • For anything that must run in a specific timezone regardless of server location, compute the offset explicitly rather than relying on server local time.

Frequently Asked Questions

What does the 0 in 0 * * * * mean?
It pins the minute field to exactly 0, so the job only fires once per hour at the top of the hour, rather than every minute (which * would produce).
How do I run a job every hour but not on the hour?
Change the minute field to any fixed value — 30 * * * * runs at :30 of every hour instead of :00.
Does @hourly mean the same thing as 0 * * * *?
Yes. @hourly is a shorthand nickname supported by most standard cron daemons (Vixie cron, systemd-cron) that expands to exactly 0 * * * *.