By field
| Position | Field | * means |
|---|---|---|
| 1 | Minute | Every minute (0-59) |
| 2 | Hour | Every hour (0-23) |
| 3 | Day of month | Every day (1-31) |
| 4 | Month | Every month (1-12) |
| 5 | Day of week | Every day of the week (0-6) |
Common asterisk-heavy patterns
| Expression | Meaning |
|---|---|
* * * * * | Every minute (the most frequent possible) |
0 * * * * | Every hour (at minute 0) |
0 0 * * * | Every day at midnight |
0 0 * * 0 | Every Sunday at midnight |
0 0 1 * * | Every 1st of the month at midnight |
0 0 1 1 * | Every January 1st at midnight |
Combining * with step values
The asterisk is often used as the range for a step:
*/5 * * * * # Every 5 minutes */15 * * * * # Every 15 minutes 0 */2 * * * # Every 2 hours (at minute 0) 0 0 */3 * * # Every 3 days (at midnight)
*/5 is shorthand for 0-59/5. Read it as "every 5th value within the full range."
* is not the same as 0
Mistaking * for 0 is the #1 cron error.
# Every minute (288 runs per day on weekdays): * 9 * * 1-5 # Once per weekday at 9 AM (5 runs per week): 0 9 * * 1-5
The first expression fires every minute during the 9 AM hour. The second fires only at exactly 9:00 AM. Always double-check the minute field — if you want a job to run "once at 9 AM," it must be 0 9, not * 9.
* in day-of-month vs day-of-week
If one day field has a value (e.g., * * 15 * *), the other day field should usually be *. Setting BOTH day fields restricts the job to days where EITHER matches (in Unix cron), which is rarely what you want:
* * 15 * 1 # Fires on the 15th AND every Monday — both, not "the 15th if it's a Monday"
To get "15th only if Monday," gate inside your script:
0 9 15 * * [ $(date +\%u) = 1 ] && /path/to/script.sh
Using * in named fields
Asterisk works in fields where you might use month names or weekday names:
0 0 * * MON # Every Monday at midnight — "*" in month, name in day-of-week 0 0 * JUN * # Every day in June at midnight — name in month, "*" in day-of-week