0

We have jobs that are scheduled to run 1 time per day - every day We do maintenance every 3rd Sunday of the month.

Up until now every month we have manually adjusted the cron to make the job run a little later in the morning then after maintenance we reset to the desired schedule

I am trying to change cron so that we

  • run at 7:00am every day EXCEPT the third Sunday of the month
  • run at 9:00am only on the third Sunday of the month

the second item I am able to handle

0 13 15-21 * 0

however, the first has me stumped. I thought this would do the job but it will only execute this if the day is between 1-14 or 22-31 but what if the 15th is not Sunday - then it won't run.

0 11 1-14,22-31 * *

How do I tell cron to run a schedule EXCEPT the third Sunday of the month?

There is a large base of guidance on how to limit when a cron runs to a specific window but I haven't found much for how to EXCLUDE a cron from a specific window

******** UPDATE ********

I think I may have come up with an answer - not sure if it is the most efficient but

0 11 1-14,22-31 * 0

0 13 15-21 * 0

0 11 1-14,22-31 * 1-6

The above will

  • run at 11:00 UTC on Sunday if date is between 1-14 or 22-31
  • run at 13:00 UTC on Sunday if date is between 15-21 (3rd Sunday)
  • run at 11:00 UTC Monday through Saturday all month
efultz
  • 1,135
  • 2
  • 11
  • 26
  • Well it appears what I thought would work will not - cron is doing an OR test not an AND test so this - 0 11 1-14,22-31 * 0 - that I thought would only do Sunday instead does the following β€œAt 11:00 on every day-of-month from 1 through 14 and every day-of-month from 22 through 31 and on Sunday.” – efultz Apr 26 '22 at 20:17

1 Answers1

0

If a cron job has different timing than others, then it best to just define it by itself rather than trying to combine, unless you put some code in your script to do what you actually want. Doing something in cron on some nth day of the month is a pretty well known problem. Most crontab man pages have this note:

Note: The day of a command's execution can be specified in the following two fields β€” 'day of month', and 'day of week'. If both fields are restricted (i.e., do not contain the "*" character), the command will be run when either field matches the crent time. For example, "30 4 1,15 * 5" would cause a command to be run at 4:30 am on the 1st and 15th of each month, plus every Friday.

So it does OR between the day of the week and the day of the month, not an AND. I don't who ever thought this was helpful, but that's the way it is. You can see solutions at:

Run every 2nd and 4th Saturday of the month

you need something like (this assumes cron runs /bin/sh):

[ `date +\%w` -eq 6 ] && <command>

on your cron job line, the above is would restrict to running only on Saturday.

Dale
  • 21
  • 1
  • 6