Cron Expression Generator — Build & Understand Cron Jobs
The free Cron Expression Generator lets you build and validate cron expressions in your browser. Choose a preset schedule or set each field manually — the tool translates the expression into plain English so you can confirm the schedule before deploying it. No signup required.
What Is a Cron Expression?
A cron expression is a string of five fields that defines a recurring schedule for automated tasks. The name comes from the Unix cron daemon, which reads a file called crontab and executes commands at the times specified by each expression. Cron syntax is now used far beyond Unix — GitHub Actions, AWS EventBridge, Kubernetes CronJobs, Heroku Scheduler, and many CI/CD tools all use it.
┌──── minute (0–59) │ ┌──── hour (0–23) │ │ ┌──── day of month (1–31) │ │ │ ┌──── month (1–12) │ │ │ │ ┌──── day of week (0–6, 0 = Sunday) │ │ │ │ │ * * * * *How to Use the Cron Generator
- Open the Cron Expression Generator.
- Click a preset to start from a common schedule (every minute, every hour, weekdays at 9am, etc.).
- Adjust individual fields — Minute, Hour, Day of Month, Month, Day of Week — using the text inputs.
- Read the plain-English description below the fields to confirm the schedule matches your intent.
- Paste the expression directly into your crontab, CI pipeline, or cloud scheduler.
Cron Field Syntax Reference
| Value type | Syntax | Example | Meaning |
|---|---|---|---|
| Wildcard | * | * * * * * | Every minute of every day |
| Specific value | n | 0 9 * * * | At 9:00 AM every day |
| Step | */n | */15 * * * * | Every 15 minutes |
| Range | n-m | 0 9-17 * * 1-5 | Every hour 9 AM–5 PM on weekdays |
| List | a,b,c | 0 0 1,15 * * | Midnight on the 1st and 15th |
Common Cron Patterns
Every N minutes
Use a step value in the minute field. */5 * * * * runs every 5 minutes.*/30 * * * * runs every 30 minutes (at :00 and :30). Steps always start from 0 — */7 runs at minutes 0, 7, 14, 21, 28, 35, 42, 49, 56, then resets at the next hour.
Specific time each day
0 3 * * * runs at 3:00 AM every day. 30 6 * * * runs at 6:30 AM. The minute field comes first, so the order is minute then hour — not the intuitive HH:MM order.
Weekdays only
0 9 * * 1-5 runs at 9:00 AM Monday through Friday. Day of week uses 0 for Sunday and 6 for Saturday. Some implementations also accept 7 as Sunday.
First of every month
0 0 1 * * runs at midnight on the 1st of every month — useful for monthly reports, billing runs, and database snapshots.
Specific months
0 0 1 1,4,7,10 * runs at midnight on the 1st of January, April, July, and October — a quarterly schedule expressed as a list.
Advanced Scheduling Patterns
Day of month vs day of week interaction
When both day-of-month and day-of-week are non-wildcard, most cron implementations (including Vixie cron on Linux) apply OR logic — the job runs when either condition matches. For example, 0 9 15 * 5 runs at 9 AM on the 15th of every month and also every Friday. If you want AND logic (only the 15th that is a Friday), you need a wrapper script that checks the date at runtime.
Chaining jobs with delays
Cron has no built-in dependency system. If job B must run after job A finishes, use a shell script that calls both commands sequentially, or use a job scheduler like Airflow, Temporal, or GitHub Actions with needs: dependencies.
Preventing overlapping runs
If a cron job takes longer than its interval, two instances can overlap. Wrap your command with flock on Linux to create an exclusive lock:
*/5 * * * * flock -n /tmp/myjob.lock /path/to/script.shStaggering jobs to reduce load
When multiple jobs run at the same minute, they hit the database simultaneously. Stagger them by a few minutes: use 0 2 * * *, 5 2 * * *, and 10 2 * * * for three jobs that nominally run at 2am. The stagger distributes database load and reduces the chance of lock contention.
Cron in Cloud and CI Environments
GitHub Actions
GitHub Actions uses standard five-field cron syntax in the schedule trigger. All scheduled workflows run in UTC. The minimum interval supported is every 5 minutes, though GitHub throttles heavily used scheduled workflows.
on:
schedule:
- cron: '0 9 * * 1-5' # 9 AM UTC on weekdaysAWS EventBridge
AWS EventBridge supports both cron and rate expressions. Its cron syntax has a sixth field for year and uses ? instead of * to indicate "any" for day-of-month or day-of-week (not both):
cron(0 9 ? * MON-FRI *) # EventBridge formatKubernetes CronJob
Kubernetes CronJobs use standard five-field cron syntax. The schedule runs in the timezone of the control plane — use timeZone: "America/New_York" in the spec (Kubernetes 1.27+) to set an explicit timezone.
Google Cloud Scheduler
Google Cloud Scheduler accepts standard 5-field cron syntax and supports setting a timezone via the --time-zone flag or in the console. This makes it one of the more flexible cloud schedulers for timezone-aware jobs.
# GCP Cloud Scheduler — 9am daily in New York
gcloud scheduler jobs create http my-job --schedule="0 9 * * *" --time-zone="America/New_York" --uri="https://my-service.example.com/run"Cron vs Other Schedulers
| Scheduler | Min interval | Timezone support | Best for |
|---|---|---|---|
| Unix cron | 1 minute | System TZ or per-job TZ | Server-level scripts |
| GitHub Actions schedule | 5 minutes | UTC only | CI/CD automation |
| AWS EventBridge | 1 minute | UTC only | AWS service triggers |
| GCP Cloud Scheduler | 1 minute | Full IANA TZ | GCP service triggers |
| Kubernetes CronJob | 1 minute | 1.25+: IANA TZ | Container workloads |
| node-cron | 1 second | IANA TZ via option | Node.js applications |
| Temporal / Airflow | Sub-second | Full IANA TZ | Complex workflow graphs |
Monitoring Cron Jobs
A cron job that silently fails is one of the hardest production problems to catch. Three strategies:
- Dead man's switch — ping a monitoring service (Healthchecks.io, Cronitor, Better Uptime) at the end of each successful run. If the ping does not arrive within the expected window, you get an alert.
- Log to a file — redirect output:
myscript.sh >> /var/log/myjob.log 2>&1. Append stdout and stderr so you can review history. - Email on failure — Unix cron sends mail to the crontab owner if a job produces output. Set
MAILTO=you@example.comat the top of your crontab to receive stderr from failing jobs.
Timezone Pitfalls
Unix cron runs in the system timezone. Cloud schedulers often default to UTC. This causes off-by-one-hour bugs that are especially painful during daylight saving time transitions — a job scheduled for 2 AM may run at 1 AM or 3 AM depending on the direction of the clock change.
Best practice: run scheduled jobs in UTC and convert to local time in application code. If your platform supports a CRON_TZ or timeZone setting, set it explicitly rather than relying on server defaults.
On Linux, you can set per-job timezone in the crontab:
CRON_TZ=America/New_York
0 9 * * * /path/to/script.sh # Runs at 9am New York timeCommon Questions
What is the minimum cron interval?
Standard cron does not support sub-minute intervals — the smallest unit is one minute. For sub-minute scheduling, use a loop within a script, a message queue (SQS, RabbitMQ), or a purpose-built scheduler like Temporal or Sidekiq.
Does cron support seconds?
Standard five-field cron does not. Quartz Scheduler (Java) adds a seconds field as a sixth column at the front. AWS EventBridge does not support seconds. Always check the specific implementation your platform uses.
How do I test a cron expression without waiting?
Use the plain-English description in this tool to verify the schedule visually. For Linux, you can temporarily change the interval to * * * * * (every minute) to confirm the job runs, then restore the production schedule.
Generate Your Cron Expression
Use the visual builder to create and validate cron expressions in seconds — presets, field inputs, and plain-English descriptions included. No signup.
Open Cron Generator