Cron Cheat Sheet
Everything you need to write a cron expression: the five fields, special characters, shortcuts, 27 common schedules you can copy, and the gotchas that make jobs not run.
Updated 28 October 2026
Check any expression: plain-English meaning and the next 10 run times in your time zone.
Open the cron parserCron syntax: the five fields
┌───────────── minute (0–59) │ ┌─────────── hour (0–23) │ │ ┌───────── day of month (1–31) │ │ │ ┌─────── month (1–12 or JAN–DEC) │ │ │ │ ┌───── day of week (0–6 or SUN–SAT, Sunday = 0) │ │ │ │ │ * * * * * command-to-run
A cron expression has five fields separated by spaces. The job runs every minute in which all fields match the current time — with one exception for the two day fields, explained under gotchas.
| Field | Allowed values | Special characters |
|---|---|---|
| 1. Minute | 0–59 | * , - / |
| 2. Hour | 0–23 | * , - / |
| 3. Day of month | 1–31 | * , - / |
| 4. Month | 1–12 or JAN–DEC | * , - / |
| 5. Day of week | 0–6 (Sunday = 0; most systems also accept 7 for Sunday) or SUN–SAT | * , - / |
Special characters
| Character | Meaning | Example | Runs |
|---|---|---|---|
* | Every value | * * * * * | Every minute |
, | List of values | 0 9,17 * * * | At 09:00 and 17:00 |
- | Range of values | 0 9 * * 1-5 | At 09:00, Monday to Friday |
/ | Step: every n-th value | */15 * * * * | Every 15 minutes |
1-30/10 | Step inside a range | 1-30/10 * * * * | At minutes 1, 11 and 21 |
Steps count from the start of the range: */15 in the minute field means minutes 0, 15, 30 and 45. Names like MON and JAN are not case-sensitive.
Common cron schedules
| Expression | Runs | |
|---|---|---|
* * * * * | Every minute | Try ↗ |
*/5 * * * * | Every 5 minutes | Try ↗ |
*/10 * * * * | Every 10 minutes | Try ↗ |
*/15 * * * * | Every 15 minutes | Try ↗ |
*/30 * * * * | Every 30 minutes | Try ↗ |
0 * * * * | Every hour, on the hour | Try ↗ |
0 */2 * * * | Every 2 hours (00:00, 02:00, 04:00 …) | Try ↗ |
0 */6 * * * | Every 6 hours (00:00, 06:00, 12:00, 18:00) | Try ↗ |
0 0 * * * | Every day at midnight | Try ↗ |
0 9 * * * | Every day at 09:00 | Try ↗ |
30 6 * * * | Every day at 06:30 | Try ↗ |
0 2 * * * | Every day at 02:00 — a common time for backups | Try ↗ |
0 9,17 * * * | Every day at 09:00 and 17:00 | Try ↗ |
0 9 * * 1-5 | At 09:00 on weekdays (Monday to Friday) | Try ↗ |
0 9-17 * * 1-5 | Every hour from 09:00 to 17:00 on weekdays | Try ↗ |
*/15 9-17 * * 1-5 | Every 15 minutes from 09:00 to 17:45 on weekdays | Try ↗ |
0 0 * * 1-5 | Midnight on weekdays | Try ↗ |
0 10 * * 6,0 | At 10:00 on Saturday and Sunday | Try ↗ |
0 0 * * 0 | Midnight every Sunday | Try ↗ |
0 12 * * 1 | Noon every Monday | Try ↗ |
0 18 * * 5 | At 18:00 every Friday | Try ↗ |
5 4 * * 0 | At 04:05 every Sunday | Try ↗ |
0 0 1 * * | Midnight on the 1st of every month | Try ↗ |
0 0 15 * * | Midnight on the 15th of every month | Try ↗ |
0 0 1,15 * * | Midnight on the 1st and 15th of every month | Try ↗ |
0 0 1 */3 * | Midnight on the first day of each quarter (Jan, Apr, Jul, Oct) | Try ↗ |
0 0 1 1 * | Midnight on 1 January | Try ↗ |
Click an expression to copy it, or Try ↗ to see its next 10 run times in the cron parser.
Shortcuts (@daily, @hourly …)
| Shortcut | Same as | Runs |
|---|---|---|
@yearly / @annually | 0 0 1 1 * | Midnight on 1 January |
@monthly | 0 0 1 * * | Midnight on the 1st of every month |
@weekly | 0 0 * * 0 | Midnight every Sunday |
@daily / @midnight | 0 0 * * * | Every day at midnight |
@hourly | 0 * * * * | At the start of every hour |
@reboot | — | Once, when the cron daemon starts |
Shortcuts work in Linux crontab (cronie, Vixie cron) and Kubernetes CronJobs. GitHub Actions and AWS EventBridge don't accept them — use the five-field form.
Gotchas: why cron jobs don't run when you expect
- Day of month OR day of week. If both day fields are set (neither is
*), the job runs when either matches.0 0 13 * 5runs on every 13th and every Friday, not only on Friday the 13th. - Time zone. crontab uses the server's time zone. GitHub Actions and AWS EventBridge use UTC. Kubernetes uses the controller's time zone unless you set
spec.timeZone. - No seconds field. Standard cron's smallest unit is one minute. Six-field expressions with seconds first (
0 0 9 * * *) are Quartz or Spring syntax and won't work in crontab — the cron parser reads both kinds. - No "last day of the month". Standard cron has no
L. Run on days 28–31 and let the script check whether tomorrow is the 1st. - Escape
%in crontab. In a crontab line,%means a new line. Writedate +\%Y-\%m-\%d. - Minimal environment. Cron jobs get a short
PATHand no shell profile. Use absolute paths such as/usr/bin/python3. - Overlapping runs. Cron starts a new run even if the last one is still going. Use
flock -n /tmp/job.lock commandto skip a run while another is active. - GitHub Actions limits. The shortest interval is every 5 minutes, and scheduled runs can start late when GitHub is busy.
Cron in GitHub Actions, Kubernetes, AWS and Spring
| System | Format | Time zone | Weekdays at 09:00 |
|---|---|---|---|
| Linux crontab | 5 fields | Server time zone | 0 9 * * 1-5 /path/to/script.sh |
| GitHub Actions | 5 fields | UTC | - cron: '0 9 * * 1-5' |
| Kubernetes CronJob | 5 fields or @shortcut | Controller, or spec.timeZone | schedule: "0 9 * * 1-5" |
| AWS EventBridge | 6 fields, adds year; one day field must be ? | UTC by default | cron(0 9 ? * MON-FRI *) |
| Spring @Scheduled | 6 fields, seconds first | Server time zone | @Scheduled(cron = "0 0 9 * * MON-FRI") |
| Quartz | 6–7 fields, seconds first; one day field must be ? | Server time zone | 0 0 9 ? * MON-FRI |
crontab commands
| Command | What it does |
|---|---|
crontab -e | Edit your crontab |
crontab -l | List your cron jobs |
crontab -r | Delete all your cron jobs (no confirmation — back up with crontab -l > backup.txt first) |
sudo crontab -u alice -l | List another user's cron jobs |
grep CRON /var/log/syslog | See when jobs ran (Debian, Ubuntu) |
journalctl -u cron | Cron logs on systemd (the unit is crond on Red Hat, Fedora) |
*/5 * * * * /path/job.sh >> /var/log/job.log 2>&1 | Save a job's output and errors to a log file |
Frequently asked questions
What does * * * * * mean in cron?
How do I run a cron job every 5 minutes?
*/5 * * * *. The */5 in the minute field means minutes 0, 5, 10 … 55.How do I run a cron job on weekdays only?
1-5 in the day-of-week field, for example 0 9 * * 1-5 for 09:00 Monday to Friday.Why didn't my cron job run?
% in the command, the script isn't executable, or both day fields are set so the schedule is not what you meant. Check the cron log (grep CRON /var/log/syslog).Can cron run every 30 seconds?
* * * * * job and * * * * * sleep 30; job. For sub-minute schedules, consider a systemd timer.