Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

К сожалению, это crontab линия неправильная. Собственно, kachow Затем скрипт будет запускаться каждый день в первые семь дней каждого месяца, а также каждый понедельник. crontab использует OR логика для объединения дней месяца и дней недели. В 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