← Back to Docs

Cron Expression for the First Monday of the Month

Use the # modifier in the day-of-week field: 0 9 * * 1#1 runs at 09:00 on the first Monday of every month (December 7, January 4, February 1, March 1). RunLater accepts it. Avoid 0 9 1-7 * 1: when both day fields are set, cron runs when either matches, so that line fires on each of the first seven days and on every Monday.

Nth weekday expressions

ExpressionRuns
0 9 * * 1#1First Monday of the month, 09:00
0 9 * * MON#1The same, with the day name
0 10 * * 2#2Second Tuesday, 10:00
0 16 * * 5#3Third Friday, 16:00
0 9 * * 1#5Fifth Monday, only in months that have one (November 30, 2026, then March 29, 2027)
0 9 * * 5LLast Friday of the month

Day numbers: 0 or 7 is Sunday, 1 Monday, 2 Tuesday, through 6 Saturday. A # value can't be combined with a comma list, so "first and third Monday" is two requests: 0 9 * * 1#1 and 0 9 * * 1#3.

The 1-7 trap

0 9 1-7 * 1 looks like "Monday, within the first seven days". Cron reads it as "day 1 to 7, or any Monday". Starting November 3, 2026 it runs on November 3, 4, 5, 6, 7, 9, 16, 23 and 30: nine times in one month instead of once.

In a Linux crontab

Vixie cron and cronie don't accept #. Put the day range in cron and the weekday test in the command:

# first Monday of the month at 09:00
0 9 1-7 * * [ "$(date +\%u)" = "1" ] && /usr/local/bin/monthly-meeting.sh

# second Tuesday: days 8-14, weekday 2
0 10 8-14 * * [ "$(date +\%u)" = "2" ] && /usr/local/bin/patch-review.sh

date +%u prints 1 for Monday through 7 for Sunday. The % needs a backslash inside crontab.

Typical uses

  • A first-Monday team reminder in Slack (see Slack reminders)
  • A monthly report or invoice run on a fixed weekday instead of a fixed date
  • A second-Tuesday patch review, the day many vendors ship monthly updates

Check any of these in the cron expression explainer, which understands # and L and lists the next run dates.

Related: last day of the month, every other week, and the cron expression guide.

Frequently asked questions

What is the cron expression for the first Monday of the month?

0 9 * * 1#1 runs at 09:00 on the first Monday of every month. The number after # is which occurrence: 1#2 is the second Monday, 2#2 the second Tuesday, 5#3 the third Friday.

Why does 0 9 1-7 * 1 run every day?

When both the day-of-month and day-of-week fields are set, cron runs when either one matches. That line runs on each of days 1 to 7 and on every Monday of the month.

Does Linux crontab support the # modifier?

No. Vixie cron and cronie reject it. Run on days 1 to 7 and let the command exit unless date +%u prints 1 (Monday).

How do I run on the last Friday of the month?

Use L after the weekday number: 0 9 * * 5L runs at 09:00 on the last Friday of every month.