Хотите выполнить сценарий в первый понедельник месяца, а затем другой сценарий в первую среду месяца.
Проблема в том, что если новый месяц начинается, например, во вторник, то действие «первая среда месяца» будет выполнено первым. Я хотел бы настроить это так, чтобы действие «первая среда месяца» происходило только в том случае, если оно следует за понедельником в этом месяце.
Логику можно использовать, чтобы понять это с точки зрения сценариев, но проблема в том, что мне это нужно в выражении 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