Генератор выражений Cron
Визуальный генератор и парсер выражений Cron для планирования задач
Что такое выражение Cron?
Cron-выражение описывает повторяющееся время запуска запланированных задач. В зависимости от планировщика оно может содержать пять, шесть или семь полей: минуту, час, день месяца, месяц, день недели, дополнительные секунды и год. Звездочки, запятые, диапазоны, шаги, вопросительные знаки и специальные обозначения позволяют записывать правила вроде «каждые 5 минут», «по будням в 9» или «в последний день месяца». Инструмент помогает читать, проверять и просматривать ближайшие запуски, чтобы не угадывать расписание по памяти. Контекст важен: Linux cron, Quartz, облачные планировщики и фреймворки отличаются полями, часовыми поясами и синтаксисом. При совместном использовании нужно заранее прояснить входные данные, допущения и ожидаемый результат, чтобы вывод не поняли неверно.
Как использовать
Как использовать
- Выберите режим генерации или разбора
- Задайте поля времени (секунды, минуты, часы, день, месяц, день недели) через выпадающие списки
- Нажимайте на готовые шаблоны для быстрого заполнения типичных выражений
- В режиме генерации показывается выражение и 5 ближайших запусков
- В режиме разбора проверяется существующее выражение и показываются времена запуска
Символы синтаксиса
- * — Все возможные значения
- , — Перечисление нескольких значений (например, 1,3,5)
- - — Диапазон (например, 1-5)
- / — Шаг интервала (например, */5 означает каждые 5)
- ? — Без определённого значения (для дня или дня недели)
- L — Последний день месяца/недели
- W — Ближайший рабочий день
- # — N-й день недели (например, 2#3 = 3-й вторник)
Примечания для разработчиков
- Используйте результат как быструю справку, а затем проверьте в реальном коде, сборке или API-контексте.
- Учитывайте версии, диалекты, переменные окружения и принятые в проекте соглашения.
Важные замечания
- Поля дня и дня недели не могут одновременно содержать значения; одно из них должно использовать ?
- У каждого поля есть допустимый диапазон: минуты 0-59, часы 0-23
- Порядок полей фиксирован: сек мин час день месяц день_недели год
- День недели не зависит от регистра; MON и mon эквивалентны
Применение
Технический принцип
Cron-выражение кодирует ноль или более ограничений по времени в полях фиксированного порядка. Классический Vixie/Bron (используемый Linux crond) содержит 5 полей: минута (0-59), час (0-23), день месяца (1-31), месяц (1-12 или JAN-DEC) и день недели (0-6 или SUN-SAT, где воскресенье = 0 по соглашению). Планировщик Quartz, получивший распространение благодаря Spring и библиотеке Egistix, добавляет начальное поле секунд для 6 полей и необязательное конечное поле года для 7. Каждое поле может принимать литеральное значение, список (1,3,5), диапазон (1-5), шаг (0/15 означает каждые 15 начиная с 0) или подстановочный символ *, который совпадает со всеми значениями. Знак вопроса ? — это сентинел, специфичный для Quartz, означающий «без определённого значения», и ДОЛЖЕН появляться ровно в одной из позиций — день месяца или день недели — когда другое содержит ограничение. Вычисление следующих N времён запуска использует жадный алгоритм прямого поиска: начинаем от контрольного момента (обычно текущее время), увеличиваем поле самого низкого уровня, не соответствующее ограничению, сбрасываем все поля более низкого уровня к минимуму и каскадируем на поля более высокого уровня при переполнении (например, минуты выше 59, часы выше 23). Это известно как итеративный метод Донована/Спунхура и работает за O(K x F), где K — количество кандидатов (обычно 5), а F — количество полей. Названия дней недели (MON, FRI и т.д.) приводятся к нижнему регистру и сопоставляются, а сокращения месяцев также принимаются. Специальный символ L в Quartz разрешается в последнее вхождение дня недели в месяце (например, 0 0 0 ? * 5L — последняя пятница), вычисляемое обратным отсчётом от последнего дня месяца до нужного дня недели. Символ W находит ближайший рабочий день (пн-пт) к заданному дню месяца, при необходимости переходя в соседний месяц. Обработка часовых поясов — самая частая ошибка конфигурации: выражение само не содержит метаданных о часовом поясе, поэтому одно и то же 0 0 9 * * ? срабатывает в разных смещениях UTC на серверах в America/New_York, Asia/Tokyo и UTC. Сокращения вроде @daily (0 0 0 * * ?), @hourly (0 0 * * * ?), @reboot (запуск один раз при старте демона, не временное выражение) и @weekly (0 0 0 ? * 1) раскрываются в эквивалентную 6-польную форму перед разбором. Распространённая ловушка — соединение дня месяца и дня недели: в классическом cron задача запускается при совпадении любого из них (логика ИЛИ), а некоторые новые диалекты переключаются на логику И. Выражение 0 0 0 15 * 5 означает «в полночь 15-го числа И каждую пятницу» в Vixie cron, а не «в полночь 15-го ИЛИ в пятницу», как думают многие новички. Проблема Y2038 не влияет на cron напрямую (он использует time_t), но любое встроенное устройство с 32-битным Unix crond переполнит знаковый 32-битный time_t 2038-01-19T03:14:07Z.
- Классическое 5-польное: мин час день_мес мес день_нед; Quartz добавляет сек (6 полей) и опционально год (7 полей).
- ? должно занимать одну из позиций день_мес/день_нед, когда другое содержит значение; * совпадает со всеми значениями в поле.
- День месяца + день недели — это ИЛИ в Vixie cron, И в некоторых новых планировщиках — проверяйте перед развёртыванием.
- L разрешается в последний день недели месяца: например, 0 0 0 ? * 5L = последняя пятница, вычисляется от длины месяца.
- W находит ближайший рабочий день (пн-пт) к заданной дате; может переходить в соседний месяц.
- Cron-выражение не содержит метаданных часового пояса: одно и то же выражение срабатывает во времени сервера, UTC или именованной зоне в зависимости от планировщика.
- Y2038: 32-битный time_t переполняется 2038-01-19 03:14:07 UTC; crond на устаревших встроенных системах будет затронут.
- Сокращения @hourly/@daily/@midnight/@weekly/@monthly/@yearly/@reboot раскрываются в эквивалентные 5- или 6-польные выражения.
- Оператор шага / отсчитывает от крайнего левого значения: 2/3 по часам срабатывает в 2, 5, 8, 11, 14, 17, 20, 23.
- Пятиитерационный жадный прямой поиск за O(KxF) для вычисления следующих N запусков от контрольного момента.
Примеры
Каждый день в полночь (ежедневный бэкап)
Expression : 0 0 * * *
Means : В 00:00 каждый день
Next runs : 2026-06-11 00:00, 2026-06-12 00:00, 2026-06-13 00:00
Use case : Резервное копирование БД, генерация ежедневных отчётовКаждые 15 минут (проверка работоспособности)
Expression : */15 * * * *
Means : В минуты 0, 15, 30, 45 каждого часа
Next runs : 14:00, 14:15, 14:30, 14:45, 15:00
Use case : Health check API, опрос очередей, задачи синхронизацииПо будням в 9:00 (уведомления в рабочее время)
Expression : 0 9 * * 1-5
Means : 09:00 с понедельника по пятницу
Next runs : Mon 09:00, Tue 09:00, Wed 09:00, Thu 09:00, Fri 09:00
Use case : Напоминание о стендапе, ежедневный дайджест в SlackПервого числа каждого месяца в 03:30 (ежемесячный биллинг)
Expression : 30 3 1 * *
Means : 03:30 первого числа каждого месяца
Next runs : Jul 1 03:30, Aug 1 03:30, Sep 1 03:30
Use case : Ежемесячное выставление счетов, ротация логов, архивацияКаждое воскресенье в полночь (еженедельная очистка)
Expression : 0 0 * * 0
Means : 00:00 каждое воскресенье (0 = воскресенье в Linux cron)
Next runs : Sun 00:00, Sun 00:00, Sun 00:00
Use case : Еженедельный отчёт по email, очистка кэша, переобучениеQuartz с секундами — каждые 30 секунд
Expression : */30 * * * * ?
Means : Каждые 30 секунд (синтаксис Quartz из 6 полей)
Next runs : 14:00:00, 14:00:30, 14:01:00, 14:01:30
Note : День недели — ?, потому что день месяца — *. Используйте Quartz, а не Linux cron, для этого формата.Часто задаваемые вопросы
Какие форматы cron поддерживаются?
Стандартный 5-полевой cron (минута час деньМесяца месяц деньНедели), 6-полевой с секундами (используется в Quartz, Spring и многих облачных планировщиках) и 7-полевой с опциональным годом. Страница позволяет выбрать формат и поясняет каждое поле по мере того, как вы собираете выражение.
Почему dayOfMonth и dayOfWeek — оба поля?
Стандартный cron трактует их как ИЛИ: «первый день месяца ИЛИ каждый понедельник» срабатывает по любому из условий. Чтобы объединить их через И, обычно нужен нестандартный синтаксис ? (Quartz) или обходной приём. Страница показывает ближайшие времена срабатывания, чтобы вы могли визуально проверить намерение.
Будет ли расписание реально выполняться в моей системе?
Нет — страница генерирует и валидирует выражение, но задача выполняется в вашем планировщике (Linux cron, GitHub Actions, Kubernetes CronJob, AWS EventBridge, Quartz и т.д.). Разные планировщики используют немного разные диалекты cron; выбирайте формат под целевую систему.
В каком часовом поясе работает расписание?
Стандартный Unix cron использует системный местный часовой пояс. Облачные планировщики различаются: AWS EventBridge по умолчанию использует UTC, GitHub Actions по умолчанию использует UTC, Kubernetes CronJob использует часовой пояс API-сервера. Читайте документацию своего планировщика и помните, что переходы DST могут запускать задачи в неожиданное время.
Как выразить «каждые 30 минут»?
*/30 * * * * (минута = 0,30; каждый час, день, месяц, день недели). Для «каждые 15 минут только в рабочее время»: */15 9-17 * * 1-5 (также ограничивает 9:00-17:00 пн-пт). Страница покажет ближайшие 5-10 срабатываний для подтверждения.
Можно ли использовать это для реальных продакшен-расписаний?
Страница только генерирует выражение; сама задача — на стороне вашего планировщика. Сначала протестируйте выражение пробным запуском (у большинства планировщиков есть опция «ручной запуск») и избегайте планирования задач на полночь (00:00), куда сходятся задачи многих систем и вызывают пики нагрузки.
Загружается ли что-либо куда-либо?
Нет. Выражение разбирается, и ближайшие времена срабатывания вычисляются в вашем браузере с помощью JavaScript-библиотеки cron.