Run a cron job every hour with 0 * * * *. Quick setup for Linux, AWS EventBridge, Quartz, Kubernetes. Examples, common mistakes, and bi-hourly alternatives.
The cron expression 0 * * * * runs a command at minute 0 of every hour, every day. The minute field is set to 0 while all other fields are wildcards (*), meaning the schedule repeats across all 24 hours, 7 days a week. This produces 24 executions per day. Common use cases include hourly log rotation, periodic data snapshots, heartbeat signals, incremental backup jobs, and hourly API rate limit resets. The advantage of specifying a non-zero minute (like 0 instead of 0) is avoiding the "top-of-hour stampede" when thousands of cron jobs fire simultaneously at :00. For Quartz Scheduler, the equivalent is 0 * * ? * * (7 fields with seconds). For AWS EventBridge, use cron(0 * ? * * *). For Kubernetes CronJob, use schedule: "0 * * * *" directly. If you want a different minute offset, simply change the first field: 0 * * * * for the top of the hour, 15 * * * * for quarter past, 30 * * * * for half past, 45 * * * * for quarter to. To run hourly only during business hours, use 0 9-17 * * 1-5 (9 AM to 5 PM, weekdays). Each run should complete within 60 minutes to avoid overlap with the next trigger. For jobs that may run long, consider using a lock mechanism or idempotent design so duplicate executions cause no harm.
The expression 0 * * * * means: at minute 0, hour *, day-of-month *, month *, day-of-week *. Each field in the cron expression controls a different time component: minute, hour, day of month, month, and day of week.
Run crontab -e in your terminal to open your crontab editor. Add a new line: 0 * * * * /path/to/your/script.sh. Save and exit. Verify with crontab -l. Make sure your script is executable (chmod +x script.sh) and uses full paths for all commands.
Quartz Scheduler: 0 * * * ?. AWS EventBridge: cron(0 * ? * * *). Kubernetes CronJob: schedule: "0 * * * *" (standard 5-field format). Each platform has slight syntax differences — use our dialect switcher above to get the exact expression.
Minute 0 (the top of the hour) is when thousands of cron jobs fire simultaneously on shared systems, causing resource spikes. Using minute 0 staggers your job away from the crowd. This is called "cron jitter" and it helps distribute system load more evenly.
Common pitfalls: (1) Cron uses a minimal PATH — always use full paths to commands and scripts. (2) Percent signs (%) must be escaped with backslash in crontab. (3) Cron runs in the system timezone — set CRON_TZ=UTC at the top of your crontab for consistent UTC scheduling. (4) Redirect output to prevent email spam: 0 * * * * /path/command >> /var/log/myjob.log 2>&1. (5) Test your cron expression with crontab.guru or our validator above before deploying.
The cron expression 0 * * * * has different syntax on various scheduling platforms. Here is the equivalent expression for each:
| Platform | Expression |
|---|---|
| Unix / Linux crontab | 0 * * * * |
| Quartz Scheduler (Java) | 0 * * * ? |
| AWS EventBridge | cron(0 * ? * * *) |
| Kubernetes CronJob | 0 * * * * |
| Vercel Cron | 0 * * * * |
| GitHub Actions | 0 * * * * (UTC) |
Key differences across platforms: Quartz uses 7 fields starting with seconds and supports L (last) and W (weekday) modifiers. AWS EventBridge requires a 6th year field and uses ? instead of * in day fields when the other day field is specified. Kubernetes uses standard 5-field Unix cron. Vercel Cron uses the same format but schedules are defined in vercel.json. GitHub Actions uses standard cron but runs in UTC timezone only, so adjust the hour field for your local timezone offset.
Follow these tips when setting up cron jobs in production: