buildcron

Cron Expression for Every Monday

The cron expression for every Monday is 0 0 * * 1. It runs once a week, at 00:00 as Sunday night turns into Monday; for a start-of-week job during office hours, use 0 9 * * 1 instead.

CRON → ENGLISH
0 minute0 hour* day of month* month1 day of week
VALID EXPRESSION

At 12:00am on Monday.

0 0 * * 1

Standard 5-field crontab syntax. Day of month and day of week are OR'd when both are set.

NEXT 5 RUN TIMES · local time

What it does

Only the day of week field is restricted. 1 is Monday — Sunday is 0 — and the 0 0 at the front sets the time to midnight. The day of month and month fields are *, so the job runs on every Monday of every month, 52 or 53 times a year.

Monday jobs are start-of-week jobs: compiling last week's metrics into a report, resetting weekly quotas or leaderboards, rotating on-call schedules, sending a “this week” planning email, or opening a new sprint in a project tracker. Running at midnight means the output is ready before anyone logs in; running at 9am means someone is around to notice if it fails.

A common next step is “the first Monday of the month”, and it's where cron surprises people. 0 9 1-7 * 1 looks right, but when both day of month and day of week are restricted cron runs when either matches — so it fires on the 1st to the 7th and on every Monday. The reliable pattern is to schedule every Monday and let the command check the date.

How 0 0 * * 1 works, field by field

FIELDVALUEMEANING
Minute0minute 0
Hour0hour 0 (midnight)
Day of month*every day of the month
Month*every month
Day of week1Monday

Put together, cron reads 0 0 * * 1 as: “At 12:00am on Monday.

To see further ahead, paste the expression into the cron calculator, which lists the next ten run times and counts how many times the schedule runs in a year.

Frequently asked questions

How do I run a cron job every Monday at 9am?

Use 0 9 * * 1. The first two fields set the time to 09:00 and the last field picks Monday; the two * in between leave the date open.

How do I run a cron job on the first Monday of the month?

Schedule it for every Monday and exit unless the day of month is 7 or less: 0 9 * * 1 [ "$(date +\%d)" -le 7 ] && /path/to/job. Writing 1-7 in the day of month field doesn't work, because cron combines it with Monday using OR.

Can I write MON instead of 1 in a cron expression?

Yes. Most cron implementations accept three-letter day names in the day of week field, so 0 0 * * MON is the same as 0 0 * * 1. Names aren't case-sensitive.