Cron every monday at 09:00
Expression: 0 9 * * 1 — At 09:00, on Monday.
At 09:00, on Monday
Next 5 runs in UTC, from 1 Jan 2026 (example)
When to use it
Weekly jobs — digest e-mails, dependency update checks, invoice runs and sprint reports — usually start the working week. Day-of-week counts from Sunday as 0, so Monday is 1; most implementations also accept the name MON and treat 7 as another Sunday. The expression fixes minute 0 and hour 9 and leaves day of month open, so it fires on every Monday of every month, 52 or 53 times a year. Teams often pair it with a Friday afternoon counterpart, for instance a cleanup or retrospective export, so that both ends of the working week are covered automatically without anybody remembering a manual chore. Weekly cadence also keeps notification fatigue low, which matters for opt-in newsletters.
Field by field
| Field | Value | Meaning |
|---|---|---|
| Minute | 0 | only 0 |
| Hour | 9 | only 09:00 |
| Day of the month | * | every day of the month |
| Month | * | every month |
| Day of the week | 1 | only Monday |
Real-world example
0 9 * * 1 /opt/reports/weekly-summary --to team@example.com
Sends last week's summary when people start work on Monday. If the team spans time zones, schedule it for the earliest one.
Variants
| Expression | Meaning |
|---|---|
0 9 * * MON | At 09:00, on Monday — same schedule using the day name |
0 9 * * 1,4 | At 09:00, on Monday and Thursday — Mondays and Thursdays |
0 0 * * 0 | At 00:00, on Sunday — Sunday at midnight, same as @weekly |
Pitfalls
- Vacation weeks and company shutdowns are invisible to cron; add an opt-out file or feature flag the script consults, rather than commenting lines in and out by hand.
- Setting both day-of-month and day-of-week (0 9 1 * 1) means the 1st OR any Monday — not the first Monday of the month.
- For "first Monday of the month" use 0 9 1-7 * * and check inside the script that today is Monday.
- A public holiday Monday still triggers the job. Skip holidays in the script if the output is meant for people.
Questions
Can I make the weekly job wait until Monday afternoon?
Yes, change only the hour and minute: 30 14 * * 1 runs at half past two. Afternoon slots avoid colliding with start-of-week traffic peaks, deploy freezes, and backlogs left over from the weekend.
How do I run a job on the first Monday of each month?
Standard cron cannot express it in one line. Schedule 0 9 1-7 * * and exit early in the script unless the weekday is Monday, for example with [ "$(date +\%u)" = 1 ].
Is Sunday 0 or 7?
Both work in Vixie cron and cronie. Monday is always 1, so 1-5 means Monday to Friday everywhere that follows the POSIX layout.
The same schedule elsewhere
- GitHub Actions:
on: schedule: - cron: '0 9 * * 1'. Always UTC, and runs can start several minutes late when runners are busy. - Kubernetes CronJob:
schedule: "0 9 * * 1"; setconcurrencyPolicy: Forbidto prevent overlapping pods andtimeZoneif you need local time. - Cloudflare Workers:
crons = ["0 9 * * 1"]under[triggers]in wrangler.toml, evaluated in UTC.
Before you deploy
Use absolute paths, because cron starts commands with a minimal PATH and without your shell profile. Make the job idempotent so a late or repeated run does no harm, log its exit code, and let a dead-man's-switch monitor alert you when an expected run never happens.