Cron expression for Every 45 minutes
*/45 * * * *
Runs every 45 minutes, around the clock (fires at :00 and :45 each hour — standard cron can't do a true 45-minute interval).
Next 5 runs (your local time)
These are shown in your browser’s timezone. The job itself runs in the scheduler’s timezone — often UTC — so the real run time can differ.
What people actually schedule with */45 * * * *
- A heartbeat or keep-alive ping where the exact cadence doesn't matter and you just want it 'roughly every 45 min'
- A medium-weight report refresh you've decided is fine to run on an uneven rhythm rather than locking to the clock
- Throttling a batch against a partner system that publishes guidance like 'no more than ~30 calls/day'
Use */45 * * * * on your platform
It’s the same 5-field expression everywhere — what changes is where you put it and which timezone it runs in.
Linux / crontab
*/45 * * * * /path/to/your-command
Runs in the server’s local timezone — check it with timedatectl.
Full field reference: crontab(5) man page.
GitHub Actions
on:
schedule:
- cron: "*/45 * * * *"
GitHub Actions always runs scheduled jobs in UTC — there is no timezone setting, and runs can be delayed under load (official docs).
Kubernetes CronJob
spec:
schedule: "*/45 * * * *"
Defaults to UTC. Set spec.timeZone (Kubernetes 1.27+)
for a specific zone — see the
CronJob docs.
Quartz / Spring @Scheduled
Quartz uses 6 fields (seconds first): 0 */45 * * * *. Watch out:
Quartz day-of-week is 1=SUN … 7=SAT (not 0–6), and day-of-month /
day-of-week use ? — double-check if your schedule touches those fields
(Quartz cron reference).
Gotchas with every 45 minutes schedules
- This is the famous lie:
*/45does NOT run every 45 minutes. Cron evaluates the minute field per-hour, so*/45 * * * *fires at :00 and :45, then resets at the new hour — giving you a 45-minute gap followed by a 15-minute gap, not a true 45-minute interval. Confirm by listing the fire times before you trust it. - A real 45-minute cadence needs a different mechanism. Standard cron can't express 'every 45 minutes' because 45 doesn't divide 60; use a systemd timer with
OnUnitActiveSec=45min, or have the script sleep/re-arm itself, or compute it with anatchain — don't fake it with*/45. - The uneven gap breaks rate-limit math. If you chose 45 minutes to stay under a quota, the real pattern (two runs 15 min apart at the hour turnover) can burst two calls close together and trip a sliding-window limiter — budget for the :45→:00 short gap, not the average.
Will you know if this job silently fails?
Cron jobs fail quietly — a server reboots, a path changes, or an error code is ignored — and nobody notices until the data is missing. A cron monitor (a dead-man’s-switch) alerts you when a scheduled job does not check in on time.
Monitor your cron jobs with UptimeRobot →
Disclosure: this is an affiliate link — we may earn a commission if you sign up, at no extra cost to you.
Is */45 * * * * the right schedule?
If you genuinely need an interval cron can honor, step to every 30 minutes or every hour — both divide 60 and fire on a true fixed cadence, unlike the */45 pattern that only pretends to.
Or use the interactive cron generator & explainer, read the complete cron syntax guide, or pick another common schedule: