Русский

Инструменты разработчика · Генератор Crontab

День месяца против дня недели в cron: правило ИЛИ, которое всех удивляет

· Как это работает

хрон календарь планирование

Два календарных фильтра объединяются через вентиль ИЛИ в одно расписание.
Оригинальная векторная иллюстрация ToolAcre

Если оба поля дня ограничены, cron запускает задание, если одно из них совпадает. В этом посте объясняется правило из crontab(5), почему оно существует и как получить расписания, которые оно запрещает.

Отчет запускался 1-го числа и каждый понедельник — выражение 0 9 1 * 1 не означает, как он выглядит

Выражение типа `0 9 1 * 1` выглядит как «09:00 в первый понедельник», если столбцы за два дня считываются как накопительные фильтры. ToolAcre не читает это таким образом. Если для дня месяца установлено значение 1, а для дня недели — понедельник, анализатор предупреждает, что любое условие может совпадать, поэтому расписание включает каждый первый и каждый понедельник.

Это не второстепенное предпочтение в формулировке. Ежемесячный отчет может запускаться четыре или пять дополнительных раз, а операция, ожидаемая только по понедельникам, также может выполняться первого числа месяца. Генератор помещает предупреждение «Стоит проверить» рядом с описанием, чтобы расширенное поведение было видно до того, как выражение будет скопировано во внешний crontab.

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

Функция реализации `dayMatches` явно обрабатывает четыре случая. Два подстановочных знака принимают каждую дату; подстановочный знак дня месяца соответствует дню недели; подстановочный день недели соответствует дню месяца; а два поля с ограниченным доступом возвращают логическое ИЛИ своих совпадений. Тесты охватывают дату, соответствующую только тринадцатому числу, только пятнице и ни одному из условий.

В описаниях сохраняется то же правило. `0 0 13 * 5` отображается как «13-го числа месяца или в пятницу», а не двусмысленный союз. Синтаксический анализ, выбор следующего запуска и вывод на английском языке используют одну и ту же интерпретацию. Такое общее поведение является более убедительным доказательством, чем изолированный ярлык справки, поскольку разногласия между этими путями немедленно создадут вводящие в заблуждение предварительные просмотры.

Анализатор реализует OR и выдает результат; оно не устанавливает историю правила

Схема рабочей тетради предлагает историческую причину создания OR, но этот репозиторий доказывает поведение, а не происхождение. Комментарии к коду идентифицируют правило в стиле Vixie, а тесты устанавливают результат, смоделированный ToolAcre. Они не документируют, кто выбрал это правило, когда оно было принято и почему было отдано предпочтение разрешительной интерпретации.

Соблюдение этой границы важно в технической письменной речи. Читателям необходимо точно знать, как этот инструмент расширяет выражение; им не нужны придуманные стандарты, чтобы безопасно использовать их. Если цель развертывания документирует другую семантику дня, ее собственное руководство превосходит предварительный просмотр в браузере. ToolAcre указывает диалект, который он вычисляет, а не утверждает, что все планировщики согласны.

Рабочий пример: перечисление 0 9 1 * 1 за один месяц — дни, когда он срабатывает, по сравнению с графиком, который хотел автор.

Рассмотрим месяц, первый день которого не понедельник. `0 9 1 * 1` производит один запуск в первый и дополнительные запуски каждый понедельник. Если первым из них является понедельник, эта дата все равно появится один раз, поскольку при следующем поиске учитывается одна календарная минута, а не два отдельных триггера. Размер союза меняется в зависимости от календаря, но не по логике.

Вы можете проверить это объединение, выбрав часовой пояс и прочитав следующие пять прогонов. Предварительный просмотр начинается строго после текущего момента и ищет календарные даты, применяя поля месяца, дня и времени. В прозе статьи не обещан конкретный месяц, поскольку живой список зависит от того, когда и где читатель осуществляет проверку.

Обходные пути для команд первого понедельника в стиле AND находятся за пределами этого генератора расписания.

В плане предлагалось внедрить проверку даты оболочки для получения поведения AND. ToolAcre не может проверить такую ​​команду: он принимает только пять полей расписания, а его скопированная полная строка содержит исполняемый файл-заполнитель. Синтаксис оболочки, экранирование процентов, доступность команд и поведение при выходе — все это относится к среде, которая в конечном итоге запускает задание.

В этом генераторе безопасным решением будет оставить однодневное поле как `*`, если только объединение OR не предназначено. Для требования первого понедельника задокументируйте, что один только cron с пятью полями не выражает пересечение на этом диалекте. Выбирайте и тестируйте решение для конкретной среды отдельно вместо гарантированного представления невыполненного фрагмента.

Другие операторы планировщика не интерпретируются этим синтаксическим анализатором с пятью полями.

Некоторые грамматики планировщика предоставляют такие операторы, как `#`, `L`, `W` или `?`, но этот синтаксический анализатор не принимает ни один из них. Он также отказывается от шести полей и объясняет, что его контракт представляет собой синтаксис crontab из пяти полей. Поэтому выражение, которое работает в другом продукте, не может быть вставлено сюда в качестве доказательства существования того же календарного правила.

Перевод диалекта начинается с определения исходной и целевой грамматик, а не с удаления знаков препинания до тех пор, пока проверка не завершится успешно. ToolAcre может помочь создать пять обычных полей, имен, диапазонов, списков и шагов цели. Он не может сохранить семантику, передаваемую неподдерживаемым оператором, и статьи намеренно избегают описания этих иностранных операторов так, как если бы они были реализованы.

Экранирование команд находится за пределами грамматики, состоящей только из выражений.

Знаки процента и кавычки команд появляются после расписания и находятся за пределами `parseCron`. Анализатор разбивает одно выражение ровно на пять частей, разделенных пробелами; он никогда не читает конвейер оболочки, команду даты или полезные данные экранированной команды. Следовательно, в этой статье не рассматривается обходной путь со знаком процента, хотя в учебнике он предлагается.

Это упущение является правильным решением. Инструмент расписания не должен подразумевать, что команда безопасна, поскольку ее поля времени проверяются. Просмотрите синтаксис команд в реальной реализации cron и оболочке с безопасными входными данными и наблюдаемыми выходными данными. Держите результат генератора в пределах календарного правила, которое он явно понимает.

Вывод: ограничьте одно поле дня, а не оба — и объяснение генератора сделает ИЛИ видимым, прежде чем вы сохраните строку.

Если оба поля дня ограничены, прочитайте их как союз и произнесите вслух «или». А еще лучше проверить предупреждения генератора и предстоящие запуски. Если эти даты превышают предполагаемый набор, верните одно поле в `*` и решите любое более специализированное требование с помощью механизма, задокументированного целевой средой.

Основной урок не в том, что cron — это загадка; дело в том, что два соседних столбца не объединяются, как другие ограничения. ToolAcre централизует это исключение в логике синтаксического анализа, описания и предварительного просмотра. Используйте эти три представления, чтобы обнаружить несоответствие до того, как выражение покинет браузер и станет рабочим графиком.