DEVESSENTIALS

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

*/15 * * * * is the classic quarter-hour schedule. The step operator /15 in the minute field means “every 15th minute starting from 0”, so the job fires four times an hour on a fixed clock grid. It does not mean “15 minutes after the last run” and it does not mean “15 minutes after I saved the crontab”.

In plain English

*/15 * * * *

Run the job every 15 minutes: at minute 0, 15, 30 and 45 of every hour, every day.

Frequency: 4 runs per hour, 96 per day. cronstrue reads it as “Every 15 minutes”.

Open */15 * * * * in the Cron Builder

Field-by-field breakdown

*/15

Minute

0–59

*

Hour

0–23

*

Day of month

1–31

*

Month

1–12

*

Day of week

0–6

  • Minute*/15 — every 15th minute starting at 0: minutes 0, 15, 30 and 45. Equivalent to the explicit list 0,15,30,45.
  • Hour* — every hour, 0 through 23.
  • Day of month* — every day of the month.
  • Month* — every month.
  • Day of week* — every day of the week. Because both day fields are *, there is no day restriction at all.

Next run times

Example: next 5 runs

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

  1. #1Mon, 5 Jan 2026, 09:15 UTC
  2. #2Mon, 5 Jan 2026, 09:30 UTC
  3. #3Mon, 5 Jan 2026, 09:45 UTC
  4. #4Mon, 5 Jan 2026, 10:00 UTC
  5. #5Mon, 5 Jan 2026, 10:15 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.

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

Crontab (Linux / macOS)

*/15 * * * * /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/15 * * * ?
0 0/15 * * * ? *

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

Quartz prepends a seconds field (0) and needs ? in one of the two day fields. Quartz writes the step as 0/15 (start at 0, step 15); Spring's @Scheduled accepts */15 and * in both day fields.

AWS EventBridge

cron(0/15 * * * ? *)

# interval alternative
rate(15 minutes)

cron(0/15 …) is clock-aligned like crontab. rate(15 minutes) is not: it counts from the moment the rule or schedule was created, so it may fire at :07, :22, :37 and :52.

GitHub Actions

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

Allowed (GitHub's minimum interval is 5 minutes), but scheduled runs are often delayed several minutes under load, and runs at the top of the hour are the most likely to be delayed or dropped.

Kubernetes CronJob

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

Forbid stops a slow run from overlapping the next quarter-hour. A 5-minute starting deadline lets a late Job still start without piling up missed schedules.

systemd timer

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

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

[Install]
WantedBy=timers.target

*:0/15 normalises to *-*-* *:00/15:00. Check it with systemd-analyze calendar '*:0/15'.

When to use every 15 minutes

  • Polling a third-party API that rate-limits to a few requests per hour.
  • Refreshing a cached dashboard or materialized view that users accept being up to 15 minutes stale.
  • Sending batched notification digests instead of one email per event.
  • Rotating short-lived credentials or pre-signed URLs that expire after 30–60 minutes.

Common pitfalls with */15 * * * *

It is aligned to the clock, not to when you deployed

If you install the crontab at 10:07, the first run is at 10:15, eight minutes later, not at 10:22. Every server with this line fires at the same instant, so a fleet of 50 machines will hit your API together at :00, :15, :30 and :45. To spread load, shift the grid with a range-step such as 7-59/15 (minutes 7, 22, 37, 52) on some hosts.

# Default grid: :00 :15 :30 :45
*/15 * * * * /usr/local/bin/sync.sh

# Same frequency, shifted by 7 minutes: :07 :22 :37 :52
7-59/15 * * * * /usr/local/bin/sync.sh

*/15 is not the same as 15

15 * * * * (no slash) runs once an hour at minute 15. That is 24 runs a day instead of 96. The two are easy to mix up when copying from a ticket or a chat message.

Overlapping runs if the job sometimes takes longer than 15 minutes

Cron does not wait for the previous run to finish. A job that normally takes 3 minutes but occasionally takes 20 will run twice at once. Wrap it with flock so a second copy exits immediately.

*/15 * * * * flock -n /tmp/sync.lock /usr/local/bin/sync.sh

Related cron expressions

Need a different schedule? Paste */15 * * * * 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 */15 * * * * mean in cron?▾

It means every 15 minutes. The minute field */15 matches minutes 0, 15, 30 and 45, and the four * fields match every hour, day, month and weekday. The job runs 96 times a day on a fixed grid aligned to the top of the hour.

What is the AWS EventBridge version of */15 * * * *?▾

cron(0/15 * * * ? *). EventBridge uses six fields (minute, hour, day-of-month, month, day-of-week, year), requires ? in one of the two day fields, and writes the step as 0/15. EventBridge rules evaluate in UTC. If you do not need clock alignment, rate(15 minutes) also works but counts from creation time.

Is */15 * * * * the same as 0,15,30,45 * * * *?▾

Yes. In every standard cron implementation */15 in the minute field expands to exactly 0,15,30,45. The explicit list is longer but makes the run minutes obvious to anyone reading the crontab.