How the step works
The slash introduces a step. */5 in the minute field expands to 0, 5, 10, 15, 20, 25, 30,
35, 40, 45, 50 and 55 — twelve values, so twelve runs per hour. The step counts from the start of
the field, not from the moment you installed the crontab, so runs land on clean clock boundaries. Two
servers with the same expression will fire at the same instant.
*/5 is exactly equivalent to writing
0,5,10,15,20,25,30,35,40,45,50,55. Some very old cron implementations do not understand the
slash operator; if you are on an unusual platform and the job never fires, the long form is the safe
fallback.
The mistake almost everyone makes once
5 * * * * is not "every 5 minutes". It is "at 5 minutes past every hour" — 24
runs a day instead of 288. A bare number is a single value; only the slash creates an interval.
Using it
# crontab
*/5 * * * * /usr/local/bin/sync-inbox.sh >> /var/log/sync.log 2>&1
# GitHub Actions (always interpreted as UTC)
on:
schedule:
- cron: "*/5 * * * *"
GitHub Actions deserves a warning: scheduled workflows are queued on a best-effort basis and are frequently delayed during periods of high load, sometimes by ten minutes or more. Treat a five-minute schedule there as "roughly every five minutes", never as a guarantee.
Spreading the load
Because */5 aligns to the clock, every machine running it hits your database or upstream
API at the same instant. If that matters, offset each host:
1-56/5 * * * * # host A: :01, :06, :11 ...
2-57/5 * * * * # host B: :02, :07, :12 ...
The range-with-step form keeps the five-minute cadence while shifting the phase.
Variations
| Expression | Runs |
|---|---|
| */5 * * * * | Every 5 minutes, 288 times a day. |
| */5 9-17 * * 1-5 | Every 5 minutes during business hours on weekdays. |
| */5 * * * 1-5 | Every 5 minutes on weekdays only. |
| 5 * * * * | Once an hour at :05 — the classic mix-up. |
| 0-55/5 * * * * | Identical to */5, written the long way. |
| 3-58/5 * * * * | Every 5 minutes, offset by three minutes. |