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 minuteNot 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>&1Equivalent expressions
@hourly— alias for 0 * * * * in Vixie cron and most compatibles30 * * * *— 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.