The cron expression */5 * * * * runs a job every 5 minutes (12 times per hour). Covers the step operator, business-hours variants, and timer alternatives.
⏰Every 5 minutes
*Any value,List separator-Range/Step1-5Range 1 through 5*/15Every 15 unitsThe cron expression */5 * * * * schedules a job to run every 5 minutes, every hour, every day. The five fields map to: minute, hour, day of month, month, day of week. A * in a field means “every valid value.” The */5 in the minute field uses the step operator to select every 5th value.
The / character in cron is called the step operator. The syntax */N means “every N units across the full range.” For the minute field:
You can also use a step on a restricted range. 10-30/5 expands to 10,15,20,25,30, firing every 5 minutes, but only within the 10-to-30 window. This is less commonly needed but valid in all major cron implementations.
*/5 * * * *
Is exactly equivalent to:
0,5,10,15,20,25,30,35,40,45,50,55 * * * *
Both forms fire 12 times per hour, 288 times per day. If you paste either into crontab -e on a Linux system, you get the same behavior. The step form is preferred in practice because it is more readable and less error prone to type.
Pinging an endpoint every 5 minutes catches failures within a 5 minute window. Shorter intervals (1 to 2 minutes) are better for critical services, but 5 minutes is a reasonable default for noncritical internal tools.
If your application caches data that expires after 10 to 30 minutes, a 5 minute cron that prefetches and populates the cache prevents cache misses from hitting downstream services.
When a webhook is not available and you need to pull data from an external source, 5 minutes is often the shortest interval that stays within rate limits. Always check the API’s rate limit documentation before setting the interval.
Some lightweight aggregation tasks (rolling up counters, flushing buffered data) run on short intervals where a 5 minute window is a natural bucket size.
Not a good fit for: anything that needs subminute precision. Cron resolution is 1 minute. For subminute jobs, use a long running process with an internal sleep loop, a systemd timer with OnCalendar=*:0/1, or a job scheduler like Celery Beat.
| Expression | Fires per hour | Typical use |
|---|---|---|
*/1 * * * * |
60 | Near real time polling |
*/5 * * * * |
12 | Health checks, cache refresh |
*/10 * * * * |
6 | Moderate polling |
*/15 * * * * |
4 | Quarter hour reporting |
*/30 * * * * |
2 | Half hour summaries |
0 * * * * |
1 | Hourly jobs |
If you are choosing between */5 and */10, ask whether catching an issue 5 minutes earlier justifies running twice as often. For most background jobs, */10 or */15 is sufficient and reduces unnecessary load.
On modern Linux systems with systemd, you can use OnCalendar in a .timer unit instead of cron:
[Timer]
OnCalendar=*:0/5
Persistent=true
OnCalendar=*:0/5 fires at every 5th minute of every hour. The Persistent=true option reruns the job if the system was off when it was scheduled to fire. Standard cron does not do this by default.
Systemd timers also log output to the journal, making journalctl -u yourjob.timer more useful than hunting through /var/log/syslog. For new systems, timers are worth considering. For existing crontab heavy infrastructure, the step syntax is battle tested and widely understood.
To check when */5 * * * * will next fire, use a cron parsing tool or run this in Python:
from croniter import croniter
from datetime import datetime
cron = croniter("*/5 * * * *", datetime.now())
for _ in range(5):
print(cron.get_next(datetime))
Or on the command line with the crontab entry active, check /var/log/syslog or journalctl after the job runs to confirm it executed at the expected times.
Nothing you paste leaves this tab. Every tool runs entirely in your browser — no upload, no server, no account.