Cron Expression Examples for Every 5, 10, 15, 30 Minutes and More

"Run this every N minutes" is probably the single most common cron requirement — polling an API, refreshing a cache, checking a queue, or syncing data. It is also the one developers get wrong most often, usually by confusing a step value with a fixed value. This guide walks through every common minute-based and hour-based interval with copy-paste-ready expressions. For the full field-by-field syntax reference, see our cron expression complete guide.

A cron expression always has exactly 5 fields, left to right*/5MINUTE0–59, step 5*HOUR0–23*DAY (month)1–31*MONTH1–12*DAY (week)0–6*/5 * * * * → fires at :00, :05, :10 ... :55, every hour, every day

How the step syntax (/) works

A standard cron expression has five fields: minute, hour, day-of-month, month, and day-of-week. The / character defines a "step" within a range. When you write */5 in the minute field, you are saying "starting from the full range (0–59), take every 5th value" — which gives 0, 5, 10, 15 ... 55. It does not mean "every 5 minutes from now" — cron always aligns to the clock, not to when the job was last triggered or when you deployed it.

┌─ minute        (0 – 59)
│ ┌─ hour         (0 – 23)
│ │ ┌─ day/month  (1 – 31)
│ │ │ ┌─ month    (1 – 12)
│ │ │ │ ┌─ day/week (0 – 6)
│ │ │ │ │
*/5 * * * *   → every 5 minutes

Common minute intervals

  • */1 * * * * — every minute (same as * * * * *)
  • */5 * * * * — every 5 minutes (00, 05, 10, 15 ... 55)
  • */10 * * * * — every 10 minutes (00, 10, 20, 30, 40, 50)
  • */15 * * * * — every 15 minutes (00, 15, 30, 45)
  • */20 * * * * — every 20 minutes (00, 20, 40)
  • */30 * * * * — every 30 minutes (00, 30)
  • 0,15,30,45 * * * * — identical to */15, written explicitly

Hourly and every-N-hours intervals

The same step logic applies to the hour field once you fix the minute field to a single value (usually 0, so the job runs on the hour):

0 * * * *      → every hour, on the hour
0 */2 * * *    → every 2 hours (00:00, 02:00, 04:00 ...)
0 */3 * * *    → every 3 hours
0 */6 * * *    → every 6 hours (4 runs a day)
0 */12 * * *   → every 12 hours (midnight and noon)
0,30 * * * *   → twice an hour, at :00 and :30
15 * * * *     → once an hour, at 15 minutes past

Combining minute and hour steps

You can combine a minute step with a restricted hour range for schedules like "every 10 minutes, but only during business hours":

*/10 9-17 * * 1-5   → every 10 minutes, 9 AM–5:50 PM, Mon–Fri
*/5 0-5 * * *       → every 5 minutes, only between midnight and 5:59 AM
*/15 8-20 * * *      → every 15 minutes, 8 AM to 8:45 PM

Remember that every time in these expressions is evaluated against whatever clock the scheduler uses — a 9-17 business-hours restriction means something different on a server set to UTC than one set to IST. If the wall-clock time actually matters, read how cron handles timezones before you rely on it.

Common Mistakes with Every-N-Minute Schedules

  • Steps don't need to divide evenly. */7 runs at 0, 7, 14, 21 ... 56 — the last gap before wraparound is shorter than 7 minutes. Prefer divisors of 60 (5, 10, 15, 20, 30) for clean, evenly spaced runs.
  • node-cron and Quartz add a seconds field. If your library shows six fields, */5 * * * * * means every 5 seconds, not minutes — always check the library's docs before assuming standard 5-field cron.
  • GitHub Actions caps frequency at 5 minutes and even that is a soft minimum — busy periods can delay runs. Don't rely on exact timing for sub-5-minute jobs there.
  • High-frequency jobs risk overlap. If a job scheduled every 5 minutes sometimes takes longer than 5 minutes to finish, add a lock file or a mutex so a new run never starts while the previous one is still going.
  • Assuming */5 respects a custom starting offset. The step always starts counting from 0 within the field's range, so */5 is always 0, 5, 10 ... 55 — you cannot make it start at :02. For an offset schedule like "2, 7, 12 ... 57," write the explicit list instead of a step.
  • Forgetting which timezone "every 5 minutes" runs in. The interval itself never changes, but the clock it's measured against can — a misconfigured server timezone shifts every run by the same amount. See how cron handles timezones before relying on business-hours restrictions like the example above.

Putting It Together: A Real Health-Check Job Every 5 Minutes

Here's a more realistic version of an "every 5 minutes" job — a health check that pings an API only during business hours, and guards against overlapping runs if a check ever hangs past its own 5-minute window:

# crontab -e
*/5 9-18 * * 1-5 /opt/scripts/health-check.sh >> /var/log/health-check.log 2>&1
#!/bin/bash
# health-check.sh — skip this run if the previous one is still active
LOCK=/tmp/health-check.lock
if [ -e "$LOCK" ]; then
  echo "$(date): previous run still active, skipping" >> /var/log/health-check.log
  exit 0
fi
touch "$LOCK"
trap 'rm -f "$LOCK"' EXIT

curl -sf --max-time 240 https://api.example.com/health || \
  echo "$(date): health check failed" >> /var/log/health-check.log

The lock file plus a trap on exit is the same overlap protection listed above, just implemented in shell instead of application code. If you'd rather run this check from inside a running Node.js or Python service instead of the system crontab, compare the trade-offs in cron vs setInterval in Node.js or see cron jobs with Python's schedule library and APScheduler. Either way, the free Cron Expression Generator turns a plain-English description straight into the expression above.

Frequently Asked Questions

What is the cron expression for every 5 minutes?

The cron expression for every 5 minutes is */5 * * * *. The step value /5 in the minute field tells cron to run at minute 0, 5, 10, 15, 20, and so on through 55.

How do I run a cron job every 30 minutes?

Use */30 * * * * to run at minute 0 and minute 30 of every hour. Alternatively you can write 0,30 * * * * which does the same thing explicitly.

What is the difference between */5 and 5 in the minute field?

*/5 means every 5 minutes starting from 0 (0, 5, 10...55). A plain 5 means the job runs once, only at minute 5 of every hour. They are not interchangeable.

What is the cron expression for every 10 minutes?

The cron expression for every 10 minutes is */10 * * * *. That fires at minute 0, 10, 20, 30, 40, and 50 of every hour — six runs per hour, evenly spaced.

Why doesn't my every-5-minutes cron job run exactly every 5 minutes?

Two common causes: the scheduler queues or delays runs under load (GitHub Actions explicitly warns about this at its 5-minute minimum), or the previous run is still executing when the next one is due and your platform skips or queues the overlap. Add a lock file or an in-process flag so overlapping runs are skipped instead of silently piling up.

Try the Free Cron Expression Generator

Skip the mental math — describe your interval in plain English (e.g. "every 10 minutes between 9 and 5 on weekdays") and get the correct cron expression instantly.

Related articles