Launch Workspace
Standard Cron · 5 fields · Half-Hourly

Cron Every 30 Minutes — */30 * * * *

Half-hourly schedule. Fires twice per hour at :00 and :30 — 48 executions per day.

Dialect:
5 fields
Plain EnglishPeriodic (Interval)

Every 30 minutes

Runs every 30 minutes. Evaluated according to STANDARD cron specifications.

Popular Presets:

What does */30 * * * * mean?

The step value */30 in the minute field produces the minute set {0, 30} — exactly twice per hour. Combined with * wildcards for all other fields, the job runs at the top of every hour and at the half-hour mark, continuously. This schedule fires 48 times per day.

Half-hourly cron jobs suit batch synchronisation tasks where 30-minute data lag is acceptable: syncing CRM contacts from an external API, refreshing product inventory counts, generating 30-minute analytics windows, or dispatching scheduled email digests at predictable half-hour intervals.

Platform Examples for */30 * * * *

Ready-to-use snippets for all major platforms and schedulers.

Linux / Crontab5-field POSIX cron
# /etc/cron.d/my-schedule
MAILTO="admin@example.com"
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Runs every 30 minutes
*/30 * * * * www-data /usr/local/bin/my-script.sh >> /var/log/my-script.log 2>&1
Kubernetesbatch/v1 CronJob manifest
apiVersion: batch/v1
kind: CronJob
metadata:
  name: my-scheduled-job
  labels:
    app: my-scheduled-job
spec:
  schedule: "*/30 * * * *"
  timeZone: "UTC"          # requires Kubernetes v1.27+
  concurrencyPolicy: Forbid
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: job
            image: alpine:latest
            command:
            - /bin/sh
            - -c
            - echo "Job executed at $(date)"
          restartPolicy: OnFailure
GitHub Actionsworkflow schedule trigger (UTC only)
name: Scheduled Workflow

on:
  schedule:
    # Runs every 30 minutes — evaluated strictly in UTC
    - cron: "*/30 * * * *"
  workflow_dispatch: # allow manual trigger

jobs:
  run-job:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Run task
        run: echo "Workflow triggered at $(date)"
Spring Boot@Scheduled — 6-field cron with seconds
@Component
public class ScheduledTask {

    private static final Logger log = LoggerFactory.getLogger(ScheduledTask.class);

    // Runs every 30 minutes
    // Spring uses 6-field cron: sec min hr dom mon dow
    @Scheduled(cron = "0 */30 * * * *", zone = "UTC")
    public void runTask() {
        log.info("Scheduled job started at: {}", LocalDateTime.now());
        // your business logic here
    }
}

Common Variations

Related expressions for similar scheduling needs.

ExpressionDescription
*/30 * * * *Every 30 minutes
0,30 * * * *Every 30 minutes — explicit list (identical)
*/30 9-17 * * 1-5Every 30 minutes during business hours (Mon–Fri 9–5)
0 * * * *Every hour (on the hour only)
30 * * * *Every hour at the half-hour mark (:30 only)
*/15 * * * *Every 15 minutes (4 times per hour)

Frequently Asked Questions

Everything you need to know about Cron expressions, syntax rules, and platform nuances.

What is the cron expression for every 30 minutes?

The cron expression "*/30 * * * *" runs at minutes 0 and 30 of every hour — exactly twice per hour, 48 times per day. It is equivalent to "0,30 * * * *".

Does */30 * * * * fire at :00 and :30 exactly?

Yes. Because 30 divides evenly into 60, the step expression always produces the set {0, 30} within the minute range. It fires at the start of each hour (:00) and at the half-hour mark (:30). This is the same as the explicit list "0,30 * * * *".

How do I run a cron job every 30 minutes in Linux?

Run "crontab -e" and add: "*/30 * * * * /path/to/script.sh". On Debian/Ubuntu systems you can also use /etc/cron.d/ for system-wide schedules with per-user execution context.

What is the Spring Boot cron for every 30 minutes?

Use @Scheduled(cron = "0 */30 * * * *", zone = "UTC") for a Spring 6-field expression. The leading "0" is the seconds field. Alternatively, @Scheduled(fixedDelay = 1800000) executes 30 minutes after the previous run finishes, which avoids overlapping if a run takes longer than 30 minutes.

How do I use */30 * * * * in a Kubernetes CronJob?

Set spec.schedule: "*/30 * * * *" in your CronJob manifest. Note that Kubernetes evaluates cron schedules in the cluster timezone (typically UTC unless spec.timeZone is set). Add spec.concurrencyPolicy: Forbid to prevent concurrent runs.