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
| Expression | Runs |
|---|---|
0 9 * * 1#1 | First Monday of the month, 09:00 |
0 9 * * MON#1 | The same, with the day name |
0 10 * * 2#2 | Second Tuesday, 10:00 |
0 16 * * 5#3 | Third Friday, 16:00 |
0 9 * * 1#5 | Fifth Monday, only in months that have one (November 30, 2026, then March 29, 2027) |
0 9 * * 5L | Last 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.shdate +%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.