Cron: Every 30 Minutes
The cron expression for "every 30 minutes", what each field means, and the next run times on your clock.
What is the cron expression for every 30 minutes?
*/30 * * * * runs a job every 30 minutes. The minute field steps by 30 from zero, so it matches minute 0 and minute 30 of every hour; the remaining four wildcards apply to all hours and days. Expect 48 executions per day, on the hour and half hour.
*/30 * * * *Every 30 minutes
- …
- …
- …
- …
- …
Reading */30 and its exact twin
With a 60 value minute field, a step of 30 leaves only two matches, 0 and 30, which makes */30 * * * * behaviorally identical to 0,30 * * * *. We tend to write the list form in shared crontabs because it states the two firing minutes outright, while the step form asks the reader to do the division. Either way the daemon fires on the hour and on the half hour, in the machine's local timezone, 48 times a day.
Half-hour cadence suits dashboards that tolerate slightly stale numbers, cache warmers that rebuild expensive query results before users ask, and CDN or sitemap pings where hourly feels sluggish but five-minute polling would waste quota.
Why intervals past 30 minutes get awkward
Thirty is the last minute step that divides 60 evenly, and that boundary matters. A step like */45 does not give you a run every 45 minutes; the minute field resets each hour, so it fires at minute 0 and minute 45, producing gaps of 45 then 15 minutes. Cron has no memory across the hour boundary.
Uneven intervals such as every 90 minutes therefore need either two crontab lines covering alternating hours, for example 0 0,3,6,9,12,15,18,21 * * * plus 30 1,4,7,10,13,16,19,22 * * *, or a different scheduler. A systemd timer with OnUnitActiveSec=90min expresses it in one line and is usually the cleaner choice.
Frequently asked
- Is */30 identical to 0,30 in the minute field?
- Yes, both match only minutes 0 and 30. The step form divides the 0-59 range by 30 and lands on the same two values the list names explicitly. Pick whichever your team finds more readable.
- Can a single cron expression run every 90 minutes?
- No. The minute field wraps at the hour, so no one-line expression produces a true 90 minute cycle. Use two lines on alternating hour sets, or a systemd timer with OnUnitActiveSec=90min, which handles it natively.
- Why did my half-hour job fire twice at 30 minutes past?
- Check for duplicate entries: the same command in both a user crontab and /etc/cron.d is the usual culprit. Cron itself will not double-fire a single */30 entry; each matching minute triggers exactly one invocation per crontab line.
More in this series
// The subscription desk
The Inference Report
The weekly briefing for AI engineers: model releases, pricing moves, benchmarks, and the news that changes what you should build with and what it costs. Every Tuesday, 5-minute read. No fluff.
Join AI engineers who stopped overpaying for tokens. Unsubscribe anytime.