DEVESSENTIALS

*/5 * * * * — What does this cron expression mean?

*/5 * * * * is the most common “near real-time” cron schedule: frequent enough for health checks and queue sweeps, sparse enough that a job taking a minute or two will not overlap itself. It is also exactly the shortest interval GitHub Actions allows, which makes it a frequent source of “why didn't my workflow run?” questions.

In plain English

*/5 * * * *

Run the job every 5 minutes: at minute 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 and 55 of every hour.

Frequency: 12 runs per hour, 288 per day. cronstrue reads it as “Every 5 minutes”.

Open */5 * * * * in the Cron Builder

Field-by-field breakdown

*/5

Minute

0–59

*

Hour

0–23

*

Day of month

1–31

*

Month

1–12

*

Day of week

0–6

  • Minute*/5 — every 5th minute starting at 0: 0, 5, 10 … 55. Same as 0-59/5.
  • Hour* — every hour.
  • Day of month* — every day of the month.
  • Month* — every month.
  • Day of week* — every day of the week.

Next run times

Example: next 5 runs

Example: if it is Monday, 5 Jan 2026, 09:07 UTC, the next runs of */5 * * * * (UTC) are:

  1. #1Mon, 5 Jan 2026, 09:10 UTC
  2. #2Mon, 5 Jan 2026, 09:15 UTC
  3. #3Mon, 5 Jan 2026, 09:20 UTC
  4. #4Mon, 5 Jan 2026, 09:25 UTC
  5. #5Mon, 5 Jan 2026, 09:30 UTC

Live times from your current clock replace this example once the page loads. Cron uses the scheduler's timezone; most cloud servers, GitHub Actions and AWS EventBridge rules use UTC.

*/5 * * * * in Quartz, AWS, GitHub Actions, Kubernetes and systemd

Crontab (Linux / macOS)

*/5 * * * * /usr/local/bin/job.sh >> /var/log/job.log 2>&1

Standard 5-field syntax used by Vixie cron, cronie, busybox crond and most libraries (node-cron, APScheduler, robfig/cron).

Quartz (6 and 7 fields)

0 0/5 * * * ?
0 0/5 * * * ? *

# Spring @Scheduled
@Scheduled(cron = "0 */5 * * * *")

In Quartz and Spring the first field is seconds. A common mistake is writing 0/5 * * * * ? in Quartz, which means every 5 seconds, not every 5 minutes.

AWS EventBridge

cron(0/5 * * * ? *)

# interval alternative
rate(5 minutes)

Use rate(5 minutes) when you only care about the interval. Use cron(0/5 …) if other systems expect runs on the 5-minute marks.

GitHub Actions

on:
  schedule:
    # Every 5 minutes, evaluated in UTC
    - cron: '*/5 * * * *'

5 minutes is GitHub's minimum, but don't rely on it: scheduled workflows are queued and are often 5–15 minutes late, so consecutive runs can be anywhere from a few minutes to much more than 5 apart.

Kubernetes CronJob

apiVersion: batch/v1
kind: CronJob
metadata:
  name: every-5-minutes
spec:
  schedule: "*/5 * * * *"
  timeZone: "Etc/UTC"
  concurrencyPolicy: Forbid
  startingDeadlineSeconds: 120
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: job
              image: alpine:3.20
              command: ["/bin/sh", "-c", "echo running"]

A short deadline drops a run that could not start within 2 minutes instead of starting it late and overlapping the next one.

systemd timer

# /etc/systemd/system/myjob.timer
[Unit]
Description=Every 5 minutes

[Timer]
OnCalendar=*:0/5
Persistent=true

[Install]
WantedBy=timers.target

systemd also offers OnUnitActiveSec=5min, which measures 5 minutes from the last activation instead of aligning to the clock.

When to use every 5 minutes

  • Uptime and health checks that page someone after two consecutive failures.
  • Sweeping a jobs table for stuck or orphaned rows.
  • Pushing metrics from a box that cannot run a full agent.
  • Renewing locks or heartbeats with a 10–15 minute TTL.

Common pitfalls with */5 * * * *

GitHub Actions will not keep a 5-minute rhythm

GitHub queues scheduled workflows and starts them when runners are free. In practice a */5 workflow often runs every 10–20 minutes during busy periods, and GitHub disables schedules in public repositories after 60 days without activity. For anything that truly needs 5-minute precision, use a real scheduler.

Seconds field confusion when porting to Quartz or Spring

Copying */5 * * * * into a 6-field scheduler shifts every field left by one. In Spring, */5 * * * * * means every 5 seconds, 60 times more often than intended. Always add the leading seconds 0 when porting.

# crontab: every 5 minutes
*/5 * * * *

# Spring @Scheduled: every 5 minutes
0 */5 * * * *

# Spring @Scheduled: every 5 SECONDS (wrong)
*/5 * * * * *

Stagger the start minute on shared infrastructure

Many teams pick */5, so :00, :05, :10 … are busy minutes on shared databases and APIs. Using 2-59/5 (minutes 2, 7, 12 …) keeps the same frequency off the crowded marks.

2-59/5 * * * * /usr/local/bin/healthcheck.sh

Related cron expressions

Need a different schedule? Paste */5 * * * * into the Cron Builder and edit it, browse all cron expressions, read the cron syntax guide or copy from the cron examples list.

Frequently Asked Questions

What does */5 * * * * mean?▾

Every 5 minutes. The minute field */5 matches 0, 5, 10 … 55 and every other field is *, so the job runs 12 times an hour and 288 times a day, aligned to the clock.

What is the Quartz cron expression for every 5 minutes?▾

0 0/5 * * * ? (6 fields) or 0 0/5 * * * ? * (7 fields with year). The leading 0 is seconds. Spring's @Scheduled uses 0 */5 * * * *.

Can GitHub Actions run a workflow every 5 minutes?▾

You can write cron: '*/5 * * * *' and GitHub accepts it, since 5 minutes is the minimum interval. Runs are best-effort, though: they are frequently delayed and can be skipped under heavy load, so treat it as “roughly every 5–15 minutes”.