Стоит отметить, что то, что выглядит как наиболее очевидный подход к этой проблеме, работает , а не .
Вы можете подумать, что вы можете просто написать запись в crontab, в которой указан день-внедельно 0 (для воскресенья) и день месяца 1-7, как здесь ...
# This does NOT work.
0 9 1-7 * 0 /path/to/your/script
... но из-за эксцентричность того, как Крон обрабатываетСтроки crontab с указанным днем недели и днем месяца , это не сработает, и фактически будет работать 1-го, 2-го, 3-го, 4-го, 5-го, 6-го и 7-го числамесяц (независимо от того, какой у них день недели) и в каждое воскресенье месяца.
Вот почему вы видите рекомендацию использовать [ ... ]
проверьте с помощью date
, чтобы установить подобное правило: либо укажите день недели в crontab, либо используйте [
и date
, чтобы убедиться, чточисло дней месяца <= 7 перед запуском сценария, как показано в <a href="https://stackoverflow.com/a/3242169/1709587"> принятом ответе , или указание диапазона дня месяца в фронтеab и использование [
и date
для проверки дня недели перед запуском, например:
# This DOES work.
0 9 1-7 * * [ $(date +\%u) = 7 ] && /path/to/your/script
Некоторые рекомендации, которые следует иметь в виду, если вы хотите, чтобы ваш crontabлиния будет работать независимо от того, в какой ОС вы ее используете:
- Используйте для сравнения
=
, а не ==
.Он более переносим, поскольку не все оболочки используют реализацию [
, которая поддерживает оператор ==
. - Используйте спецификатор
%u
для date
, чтобы получить число дня недели в виде числа, а не оператор %a
, потому что %a
дает разные результаты в зависимости от локали, в которой запускается date
. - Просто используйте
date
, а не /bin/date
или /usr/bin/date
, так какУтилита date
расположена в разных системах по-разному.