Парсер cron-выражений

Пять полей через пробел или сокращение, например @daily.

Вам достаётся чужой crontab, набитый строками вроде 0 */2 * * 1-5 и 30 3 * JAN,JUL 1. Парсер раскладывает каждое поле на точный набор значений, которые оно охватывает: вместо того чтобы гадать, что скрывается за */2, вы видите все двенадцать часов и их количество рядом. Кроме того, вы получаете нормализованную форму из 5 полей, предупреждение, если выражение попало в известную ловушку, и 5 ближайших запусков, рассчитанных в вашем часовом поясе.

Как разобрать cron-выражение

  1. 1

    Вставьте выражение

    Строка из 5 полей (`* * * * *`): минута, час, день месяца, месяц и день недели. Сокращения вроде `@daily` тоже работают.

  2. 2

    Прочитайте разложенные поля

    Для каждого поля перечислены значения, которые оно охватывает, и их количество, поэтому `*/2` в поле часа показывает 0, 2, 4 и остальные девять значений, которые в него попадают.

  3. 3

    Проверьте предпросмотр ближайших запусков

    Ближайшие 5 срабатываний, рассчитанные прямо в браузере по часовому поясу вашего устройства. Если они расходятся с замыслом, уточните выражение.

  4. 4

    Прочитайте предупреждения

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

Во что разворачивается каждое поле

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

Поле Диапазон * охватывает Примечания
Минута 0-59 60 значений Главный источник бесконтрольно запускающихся задач
Час 0-23 24 значения 24-часовой формат, а не 1-12
День месяца 1-31 31 значение В коротких месяцах недостающие дни просто пропускаются
Месяц 1-12 12 значений Принимаются и названия от JAN до DEC
День недели 0-7 7 значений И 0, и 7 означают воскресенье

Операторы внутри поля: * все значения, 1,5,10 список, 1-5 диапазон, */15 шаг, отсчитываемый от начала диапазона, и 0-45/15 шаг внутри диапазона.

Названия и сокращения тоже принимаются

Названия месяцев и дней недели разбираются и разворачиваются в числа, которым соответствуют: для 30 3 * JAN,JUL 1 в поле месяца будет 1, 7, а в поле дня недели 1. Именованные сокращения разворачиваются в форму из 5 полей раньше всего остального:

Сокращение Разворачивается в Что означает
@yearly, @annually 0 0 1 1 * Полночь 1 января
@monthly 0 0 1 * * Полночь 1-го числа
@weekly 0 0 * * 0 Полночь в воскресенье
@daily, @midnight 0 0 * * * Полночь каждый день
@hourly 0 * * * * Начало каждого часа

@reboot тоже распознаётся, но разворачивать здесь нечего: задача выполняется один раз при запуске машины, поэтому и ближайших запусков у неё не будет.

Предупреждения, которые стоит прочитать

  • Ограничены оба поля дня. 0 0 1 * MON не значит «1-го числа, но только если это понедельник». Когда ограничены оба поля дня, стандартный cron объединяет их по ИЛИ, поэтому такая строка сработает и 1-го числа каждого месяца, и каждый понедельник. Парсер выводит это предупреждение, а предпросмотр запусков следует тому же правилу ИЛИ.
  • Дата, которой не бывает. 0 0 30 2 * просит 30 февраля. Синтаксически выражение корректно, и cron его примет, но сработать оно не сможет никогда. Парсер прямо об этом сообщает, вместо того чтобы показать пустой список без объяснений.
  • Операторы Quartz. L (последний), W (ближайший рабочий день), # (день недели по номеру в месяце) и ? относятся к расширениям Quartz, а не к стандартному crontab. Внутри строки из 5 полей они распознаются и помечаются, а в поле вместо списка значений указано, что это оператор Quartz. Время запусков не рассчитывается, потому что стандартный cron такую строку не выполнил бы вовсе.

Что отклоняется сразу

  • Неверное число полей. Строка Quartz из 6 полей с секундами или из 7 полей с годом отклоняется по количеству полей.
  • Значения вне диапазона, например минута 75 или месяц 13.
  • Убывающий диапазон вроде 5-1.
  • Нулевой шаг, например */0.

В каждом отказе названы поле и значение, которые его вызвали, поэтому вы правите одну деталь, а не переписываете строку целиком.

Часовой пояс

Ближайшие запуски рассчитываются в браузере, в том часовом поясе, который выставлен на вашем устройстве. Сам crontab работает по времени той машины, где он установлен, поэтому, если сервер живёт по UTC, а вы нет, перед сравнением сдвиньте время на нужную разницу.

Часто задаваемые вопросы

Как расписание они не разбираются. Строка Quartz из 6 полей с секундами или из 7 полей с годом отклоняется по количеству полей. Операторы Quartz внутри обычной строки из 5 полей (L, W, #, ?) работают иначе: они распознаются и помечаются, но время запусков не рассчитывается, потому что стандартный cron такую строку тоже не выполнил бы.

Обычно причины две: разница часовых поясов между вашим устройством и сервером, где стоит crontab, либо заданные сразу оба поля дня. Когда ограничены и день месяца, и день недели, cron срабатывает при совпадении любого из них, а не обоих сразу, поэтому 0 0 1 * MON запускается гораздо чаще, чем многие ожидают. Количество значений рядом с каждым полем быстрее всего подскажет, какое поле оказалось шире, чем вы думали.

Да. Kubernetes использует стандартный синтаксис из 5 полей. Учитывать нужно только часы: CronJob работает в часовом поясе кластера (по умолчанию UTC, если в spec.timeZone не указано иное), а предпросмотр здесь берёт часовой пояс вашего устройства.

Это именованные сокращения, которые cron в Linux принимает вместо пяти полей. @daily (он же @midnight) равен 0 0 * * *, @weekly равен 0 0 * * 0, @monthly равен 0 0 1 * *, @yearly (он же @annually) равен 0 0 1 1 *, а @hourly равен 0 * * * *. Вставьте любое из них, и парсер покажет, в какую форму из 5 полей оно разворачивается. Исключение составляет @reboot: задача выполняется при запуске системы, поэтому расписания и ближайших запусков у неё нет.

Сопутствующие инструменты

Справочная таблица ASCII

Полная таблица ASCII от 0 до 127 с десятичным, шестнадцатеричным, восьмеричным и двоичным представлением, а также записью числовых ссылок HTML, включая NUL, LF и DEL.

Справочник символов HTML

Справочник HTML-сущностей с поиском, их именованными и числовыми кодами, а также копированием специальных символов и знаков одним кликом.

Смешивание цветов

Смешайте два HEX-цвета в 2-20 равномерных образцов. Каждый промежуточный цвет показывается как HEX-код в верхнем регистре, включая оба края.

Счетчик FPS

Измерьте FPS браузера через requestAnimationFrame: сглаживание, минимальная и максимальная частота кадров, порог предупреждения и график по желанию. Работает локально, без загрузок и API.

Генератор случайных букв

Генерируйте случайные буквы A-Z. Выберите количество, верхний или нижний регистр либо смешанный вариант для игр, заданий и уроков.

Справочник сочетаний клавиш

Ищите документированные сочетания по умолчанию для VS Code, Chrome и Bash с GNU Readline в macOS, Windows и Linux.

Инструмент доступен на других языках