Cron Expression for Every Hour

0 * * * *

0 * * * * runs at the top of every hour. The 0 pins the minute; leaving the minute as * is the classic mistake that fires the job every minute instead.

Next runs, in your timezone

 

The every-minute trap

* */1 * * * looks like "every hour" but is not: the minute field is still *, so it matches every minute of every hour. Always pin the minute field. @hourly is a readable alias for 0 * * * * in most crons.

0 * * * *    # correct: on the hour
* */1 * * *  # wrong: fires every minute

Not on the hour

Everything else on the machine also runs at :00. Picking another minute costs nothing and avoids the spike — the cadence is still exactly hourly.

17 * * * * /path/to/job.sh >> /var/log/myjob.log 2>&1

Equivalent expressions

  • @hourlyalias for 0 * * * * in Vixie cron and most compatibles
  • 30 * * * *hourly at half past — same cadence, off-peak minute

Run a SQL query on this schedule

If the job behind this schedule is a database query, you can skip the server and the crontab: SaturnSQL runs saved SQL queries on a cron expression — this exact syntax, with a real timezone field — and delivers the results to Google Sheets or Slack. Minimum interval 5 minutes.