*/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”.
*/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 BuilderField-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: if it is Monday, 5 Jan 2026, 09:07 UTC, the next runs of */15 * * * * (UTC) are:
- #1Mon, 5 Jan 2026, 09:15 UTC
- #2Mon, 5 Jan 2026, 09:30 UTC
- #3Mon, 5 Jan 2026, 09:45 UTC
- #4Mon, 5 Jan 2026, 10:00 UTC
- #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>&1Standard 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.shRelated cron expressions
Every 10 minutes
*/10 * * * *
Every hour
0 * * * *
At minute 15 of every hour
15 * * * *
Every 5 minutes
*/5 * * * *
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.