Crontab - первая среда месяца за которым следует первый понедельник этого месяца

Требуется выполнить сценарий в первый понедельник месяца, а затем другой сценарий в первую среду месяца.

Проблема в том, что если новый месяц начинается, например, во вторник, то сначала выполняется действие «первая среда месяца». Я бы хотел, чтобы это было настроено так, чтобы «первая среда месяца» "действие происходит только в том случае, если оно следует за понедельником в этом месяце.

Можно использовать логику, чтобы выяснить это с точки зрения сценариев, но проблема в том, что мне это нужно в выражении cron, поскольку это единственный способ запланировать это в системе, которую я использую (для расширенного планирования требуется выражение cron, и детали этой системы не имеют отношения к этому вопросу).

Изменить: нет никакой зависимости или взаимосвязи между вышеупомянутыми скриптами, выполняемыми cron. Для простоты вопроса, они будут просто двумя отдельными cronjobs в том же crontab.

2
задан 4 October 2019 в 16:43
1 ответ

Чтобы запустить команду в первый понедельник месяца, я бы предложил эту строку crontab , сначала:

# m h d o w u cmd
0 3 1-7 * 1 root /usr/local/sbin/kachow

Потому что день недели 8-го месяца day определенно совпадает с днем ​​1-го месяца, строка crontab , указывающая как первые семь дней месяца, так и понедельник, как ожидается, достигнет первоначального намерения, не так ли?

К сожалению, crontab строка неверна. Фактически, сценарий kachow будет запускаться каждый день в первые семь дней каждого месяца, а также каждый понедельник. crontab использует логику ИЛИ для объединения дней месяца и дней недели. На странице руководства crontab (5) есть следующее примечание:

Примечание: день выполнения команды может быть указан в двух полях - день месяца и день недели. Если оба поля ограничены (т. Е. Не *), команда будет запущена, когда или поле совпадет с текущим временем. Например, «30 4 1,15 * 5» вызовет выполнение команды в 4:30 утра 1 и 15 числа каждого месяца плюс каждую пятницу.


Логика должна быть определена в части команды строки crontab также, чтобы ограничить выполнение команды первым понедельником месяца. Следовательно, любая из следующих строк будет работать должным образом:

# m h d o w u cmd
0 3 1-7 * * root [ $(date +%u) -eq 1 ] && /usr/local/sbin/kachow
# m h d o w u cmd
0 3 * * 1 root [ $(date +%-d) -le 7 ] && /usr/local/sbin/kachow

Точно так же сценарий, запускаемый в первую среду месяца, только если следующий понедельник в том же месяце может быть запланирован одним из crontab строки ниже. Я считаю, что 8-й и 9-й дни месяца следует исключить из логики; в противном случае сценарий woof-woof неожиданно запустится во вторую среду месяца.

# m h d o w u cmd
0 3 3-7 * * root [ $(date +%u) -eq 3 ] && /usr/local/sbin/woof-woof
# m h d o w u cmd
0 3 * * 3 root [ $(date +%-d) -ge 3 -a $(date +%-d) -le 7 ] && /usr/local/sbin/woof-woof
1
ответ дан 3 December 2019 в 12:29

Теги

Похожие вопросы