Требуется выполнить сценарий в первый понедельник месяца, а затем другой сценарий в первую среду месяца.
Проблема в том, что если новый месяц начинается, например, во вторник, то сначала выполняется действие «первая среда месяца». Я бы хотел, чтобы это было настроено так, чтобы «первая среда месяца» "действие происходит только в том случае, если оно следует за понедельником в этом месяце.
Можно использовать логику, чтобы выяснить это с точки зрения сценариев, но проблема в том, что мне это нужно в выражении cron, поскольку это единственный способ запланировать это в системе, которую я использую (для расширенного планирования требуется выражение cron, и детали этой системы не имеют отношения к этому вопросу).
Изменить: нет никакой зависимости или взаимосвязи между вышеупомянутыми скриптами, выполняемыми cron. Для простоты вопроса, они будут просто двумя отдельными cronjobs в том же crontab.
Чтобы запустить команду в первый понедельник месяца, я бы предложил эту строку 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