Запускать задание cron в первый понедельник каждого месяца?

Запускать задание cron в первый понедельник каждого месяца?

Я хотел бы запустить задание из cron в 8.30 в первый понедельник каждого месяца. На странице cron в Википедии говорится:

Хотя обычно задание выполняется, когда все поля спецификации времени/даты соответствуют текущему времени и дате, есть одно исключение: если и «день месяца», и «день недели» ограничены (не «*»), тоилиполе «день месяца» (3) или поле «день недели» (5) должно соответствовать текущему дню.

(выделено мной)

Означает ли это, что я не могу сделать это в первый понедельник месяца, я могу сделать это только в первый (или какой-то другой) день месяца? Я не могу придумать, как это обойти.

решение1

Вы можете поместить условие в фактическую команду crontab (общий способ):

[ "$(date '+%u')" = "1" ] && echo "It's Monday"

если ваша локаль EN/US, вы также можете сравнить строки (первоначальный ответ):

[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"

Теперь, если это условие истинно в один из первых семи дней месяца, у вас есть его первый понедельник. Обратите внимание, что в crontab синтаксис процентов должен быть экранирован (общим способом):

0   12  1-7 *   *   [ "$(date '+\%u')" = "1" ] && echo "It's Monday"

если ваша локаль EN/US, вы также можете сравнить строки (первоначальный ответ):

0   12  1-7 *   *   [ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"

Замените echoкоманду на ту, которую вы хотите запустить. Я нашеланалогичный подходслишком.

решение2

У меня есть компьютер с испанской локалью, поэтому этот подход мне не подходит, потому чтопнизменения влунь

Другие языки тоже не справились бы, поэтому я немного изменил принятый ответ, устранив языковой барьер:

 0 9 1-7 * *   [ "$(date '+\%u')" = "1" ] && echo "¡Es lunes!"

решение3

Мне проще, когда нет необходимости иметь дело с номерами дней.

Запуск в первый понедельник месяца:

0 2 * * 1 [ `date '+\%m'` == `date '+\%m' -d "1 week ago"` ] || /path/to/command

т.е. если месяц 1 неделю назад не совпадает с текущим месяцем, то мы находимся в 1-м числе 1 (= понедельник) месяца.

Аналогично, для Третьей пятницы

0 2 * * 6 [ `date '+\%m'` == `date '+\%m' -d "3 weeks ago"` ] || /path/to/command

т.е. если месяц 3 недели назад отличается от текущего месяца, то мы находимся на 3-м дне 6-го числа (= пятница) месяца.

решение4

Я запланировал выполнение задания на четвертый понедельник каждого месяца в 16:00 следующим образом:

0 16 22-28 * Mon [ "$(date '+\%a')" == "Mon" ] && touch /home/me/FourthMonOfMonth.txt

Связанный контент