Skip to content

Every 30 minutes cron: what */30 * * * * means and the half-hour pitfalls

Runs in your browser — nothing you paste leaves this page. How we prove that

Cron Expression Tester playground

Example

Five fields — minute, hour, day of month, month, day of week. Macros like @daily are supported too.

Results update as you type — press Enter to run now.

Timezone
fig. 04 — cron-expression-tester · scheduling Valid
Result

Every 30 minutes.

Minute*/30
Hour*
Day of month*
Month*
Day of week*
Next runs
  • Computed in your browser, in your timezone.

`*/30 * * * *` fires twice an hour, at :00 and :30, which is 48 runs a day. The engine reads it as: Every 30 minutes.

What */30 actually matches

In the minute field, */30 starts at 0 and adds 30, so it matches minutes 0 and 30 and nothing else. It is exactly the same as 0,30 * * * *. The remaining fields are wildcards, so there is no restriction on hour, date, month or weekday.

The parser on this page agrees: Every 30 minutes. The next run times in the panel above are computed in your browser, in your own timezone, so they are not printed in this text.

A frequent mistake is to read */30 as thirty minutes after the job last ran. Cron has no memory of previous runs: the schedule is a pattern over wall-clock minutes, and a crontab edited at 10:17 still fires next at 10:30.

Example and locking

*/30 * * * * flock -n /run/lock/reindex.lock nice -n 10 /opt/search/bin/reindex-delta is a typical half-hourly maintenance job: flock stops a slow run overlapping the next, and nice keeps it from competing with request-serving processes. Half-hourly jobs often grow slowly until one day they take 31 minutes; the lock turns that from a pile-up into a skipped run you can alert on.

Daylight saving and the server clock

Cron evaluates the expression in the cron daemon's timezone, which is normally the server's local zone (/etc/localtime) unless the crontab sets CRON_TZ. On the spring-forward night one hour disappears and its two runs with it; on the fall-back night the repeated hour can run twice more. Servers set to UTC avoid both, which is why many teams keep infrastructure clocks on UTC and convert only in reports.

systemd, Kubernetes and GitHub Actions

systemd: OnCalendar=*:0/30, or the explicit *-*-* *:00,30:00. Kubernetes accepts schedule: "*/30 * * * *" and, since version 1.27, a timeZone field such as Europe/Berlin if the half hours must follow a local clock. GitHub Actions runs it in UTC only. Related schedules: every 15 minutes doubles the frequency, every hour halves it.

FAQ

Questions, answered.

Tap a question to expand the answer.

Use an explicit list, 15,45 * * * *, or a step with a start, 15-59/30 * * * *. Both match the same two minutes.

No. */45 matches minutes 0 and 45, so the gaps alternate between 45 and 15 minutes. A true 45-minute interval needs a systemd timer with OnUnitActiveSec=45min or a scheduler outside cron.

More free, private DevOps tools.

The Cron Expression Tester is one tool in OpsCanopy — a growing canopy of browser-based validators, converters and testers that never touch a server.

New to Linux?  Read the Linux guide →

42 free tools, every one offline-capable — opscanopy.com works with no signup and nothing uploaded.

Scheduling on Linux? Pair this with the Cron to systemd Converter, or browse the full tools directory.

Not affiliated with or endorsed by any cron implementation. Format names are used only to describe what this tool reads. OpsCanopy is free and open.