CodeKitHub
Инструменты для кода

Генератор Cron-выражений

Последнее обновление:

Cron-выражение — это строка из пяти полей (минута, час, день месяца, месяц, день недели), которая сообщает планировщику, такому как Unix cron, crontab или CI/CD-конвейер, когда именно запускать задачу — например, `*/15 9-17 * * MON-FRI` означает «каждые 15 минут, с 9 до 17 часов, с понедельника по пятницу». Этот инструмент работает в обе стороны: постройте расписание с помощью простых выпадающих списков и получите cron-строку, либо вставьте существующее cron-выражение и мгновенно увидите понятное описание на русском языке плюс следующие 5 моментов его фактического запуска. Инструмент следует стандартному синтаксису cron POSIX/Vixie из 5 полей, который используется в Unix, Linux crontab и большинстве планировщиков задач — каноническую спецификацию см. на странице man crontab(5). Всё выполняется локально в вашем браузере; ничего из введённого никуда не отправляется.

Описание
Ближайшие запуски
    Конструктор
    Минута
    Час
    День месяца
    Месяц
    День недели
    Справка по синтаксису
    • * — any value
    • , — value list separator (e.g. 1,3,5)
    • - — range of values (e.g. 1-5)
    • / — step values (e.g. */15 = every 15)

    Что это за инструмент?

    Cron-выражение — это компактная строка расписания из пяти полей — `минута час день-месяца месяц день-недели` — используемая демоном Unix `cron` и практически любым планировщиком задач, созданным по его образцу (crontab, Kubernetes CronJobs, `schedule:` в GitHub Actions, Airflow, Jenkins). Каждое поле принимает звёздочку (`*`, означающую «любое значение»), конкретное число, список через запятую (`1,15,30`), диапазон (`9-17`), шаг (`*/15`, означающий «каждые 15 единиц»), а для месяца и дня недели — трёхбуквенное имя (`JAN`, `MON`) вместо числа.

    Каноническое определение этого синтаксиса содержится на странице man crontab(5) в Linux, где документированы те же пять полей, специальные символы (`* , - /`) и восемь сокращённых строк с `@` (`@reboot`, `@yearly`/`@annually`, `@monthly`, `@weekly`, `@daily`/`@midnight`, `@hourly`), которые большинство реализаций cron, включая Vixie cron (версию, поставляемую в большинстве дистрибутивов Linux), поддерживают как псевдонимы для распространённых расписаний.

    Этот инструмент реализует именно этот стандартный формат из 5 полей — формат, который вы бы вставили напрямую в `crontab -e` на сервере Linux или macOS, или в поле `schedule:` Kubernetes CronJob. Он не реализует синтаксис Quartz cron — другой формат из 6 или 7 полей, используемый планировщиком Quartz Scheduler в Java и некоторыми инструментами сторонних производителей (см. раздел сравнения ниже, чтобы понять, когда он вам нужен).

    Зачем его использовать?

    • Вам достался crontab от уволившегося коллеги, и нужно понять, что на самом деле делает выражение вроде `0 3 1,15 * *`, прежде чем трогать продакшен-сервер.
    • Вы добавляете `schedule:` в workflow GitHub Actions и хотите избежать классической ошибки с перепутанным порядком полей, из-за которой задача запустится совсем не в то время.
    • Пишете манифест CronJob для Kubernetes и хотите заранее проверить по списку следующих запусков, действительно ли ночной батч сработает в нужное время с учётом часового пояса, прежде чем выкатывать в прод.
    • Уже наступали на грабли cron, когда «8-е число» и «каждый понедельник» в одном выражении срабатывали оба, и теперь всегда сверяете следующие запуски перед публикацией выражения, объединяющего день месяца и день недели.
    • Нужно превратить простое требование — «каждые 15 минут по будням с 9 до 17» — в корректное выражение, не ошибившись вручную с запятой или слэшем.
    • Расписание внутренних заданий компании — чувствительная информация, поэтому предпочтительнее инструмент, который работает полностью в браузере и ничего не отправляет на внешний сервер.

    Как использовать

    1. Чтобы перевести выражение: введите или вставьте cron-строку из 5 полей (или сокращение с @, например `@daily`) в поле ввода.
    2. Прочитайте описание на понятном языке и следующие 5 вычисленных моментов запуска ниже — оба обновляются в реальном времени по мере ввода.
    3. Чтобы вместо этого построить выражение: откройте раздел «Конструктор», выберите режим (каждый / каждые N / конкретное значение) для каждого из пяти полей и нажмите «Сгенерировать выражение».
    4. Сгенерированное выражение заполняет поле ввода выше и сразу же передаётся в панели описания и следующих запусков.
    5. Используйте легенду синтаксиса внизу как быструю справку по символам `*`, `,`, `-` и `/`.
    6. Скопируйте итоговое выражение кнопкой «Копировать» и вставьте его в crontab, конфигурацию CI или планировщик.

    Пример

    Ввод

    */15 9-17 * * MON-FRI

    Результат

    В 09:00, 09:15, 09:30, 09:45, 10:00 ... 17:45, по понедельникам, вторникам, средам, четвергам, пятницам

    Это выражение запускается каждые 15 минут, но только в диапазоне часов с 09:00 до 17:59 и только по будням — типичное расписание опроса в «рабочие часы».

    Стандартный cron и Quartz cron

    «Синтаксис cron» — это не единый универсальный стандарт: два наиболее распространённых формата отличаются количеством полей и значением некоторых специальных символов. Используйте эту таблицу, чтобы убедиться, что вы используете правильный формат для вашего планировщика.

    ПараметрСтандартный cron (этот инструмент)Quartz cron
    Количество полей5 (minute hour dom month dow)6 или 7 (добавляет секунды и опционально год)
    Используется вcrontab Linux/macOS, Kubernetes CronJob, GitHub ActionsQuartz Scheduler в Java, некоторые корпоративные планировщики
    Заданы и день месяца, и день неделиСовпадает с ЛЮБЫМ из условий (объединение/ИЛИ)Требует `?` в одном из двух полей — нельзя задать значения в обоих одновременно
    Дополнительные спецсимволыНет, кроме `* , - /`Добавляет `?`, `L` (последний), `W` (ближайший будний день), `#` (n-й день недели месяца)
    Планирование с точностью до секундНе поддерживаетсяПоддерживается (первое поле)

    Похожие инструменты

    Работаете с конфигурациями, расписаниями или временными метками? Эти инструменты хорошо сочетаются с генератором cron.

    Конвертер временных меток · Конвертер мирового времени · Калькулятор дат

    Частые ошибки с часовыми поясами в продакшене

    Cron-выражение может быть технически корректным и всё равно запускаться совсем не тогда, когда ожидалось в продакшене. Особенно часто это случается, когда команда использует облачные серверы или Docker-контейнеры, по умолчанию настроенные на UTC, — в итоге задача, которая должна была выполняться ночью, срабатывает средь бела дня по местному времени. Проверка «следующих моментов запуска» при генерации или проверке выражения помогает поймать такую ошибку до того, как она затронет продакшен.

    • Перед деплоем расписания проверьте часовой пояс сервера или контейнера, например командой `date`.
    • Помните, что cron в GitHub Actions и большинстве CI-раннеров вычисляется в UTC — всегда пересчитывайте от локального времени перед публикацией.
    • Не забывайте, что одновременное указание дня месяца и дня недели работает как «ИЛИ», а не «И» — проверяйте следующие запуски, чтобы убедиться, что задача не сработает в лишние дни.
    • На серверах в регионах с переходом на летнее время расписание может сдвигаться на час дважды в год — работа с UTC внутри системы и перевод в локальное время на уровне приложения снимает эту проблему.

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

    Что такое cron-выражение?

    Cron-выражение — это текстовая строка из 5 полей (`минута час день-месяца месяц день-недели`), которая задаёт повторяющееся расписание для демона Unix `cron` и совместимых планировщиков. Каждое поле может быть `*` (любое значение), числом, списком через запятую, диапазоном (`a-b`) или шагом (`*/n`); поля месяца и дня недели также принимают трёхбуквенные имена, такие как `JAN` или `MON`. Полная спецификация документирована на странице man crontab(5).

    Что происходит, когда ограничены и день месяца, и день недели?

    Это известная особенность cron: согласно семантике POSIX cron, когда ОБА поля — день месяца и день недели — ограничены (не равны `*`), задача запускается при выполнении ЛЮБОГО из условий — это объединение (ИЛИ), а не пересечение (И). Например, `0 4 8 * MON` запускается в 4 утра и 8-го числа каждого месяца, И каждый понедельник, а не только по понедельникам, выпадающим на 8-е число. Этот инструмент реализует именно такое поведение объединения при вычислении следующих моментов запуска.

    Стандартный cron или Quartz cron — что вам нужно?

    Этот инструмент генерирует стандартный синтаксис cron POSIX/Vixie из 5 полей — формат, используемый `crontab` в Linux/macOS, Kubernetes CronJobs, `schedule:` в GitHub Actions и большинством исполнителей задач, производных от Unix. Quartz cron, используемый планировщиком Quartz Scheduler в Java и построенными на нём инструментами (некоторые корпоративные планировщики, старые конфигурации Spring Batch), — это другой формат из 6 или 7 полей, добавляющий ведущее поле секунд и меняющий значение некоторых специальных символов (`?` означает «нет конкретного значения» в полях дня, `L`/`W`/`#` означают «последний день», «ближайший будний день» и «n-й день недели месяца»). Если в вашем планировщике 6 или 7 полей, или в документации упоминаются `?`, `L`, `W` или `#`, вам нужен инструмент специально для Quartz — выражения из этого генератора там не будут корректно распознаваться. Если полей ровно 5 (или используется сокращение вроде `@daily`), вы попали по адресу.

    Что означают сокращения @yearly, @monthly, @weekly, @daily и @hourly?

    Это нестандартные, но широко поддерживаемые сокращённые строки, разворачивающиеся в распространённые выражения из 5 полей: `@yearly`/`@annually` = `0 0 1 1 *` (раз в год, 1 января в полночь), `@monthly` = `0 0 1 * *` (1-го числа каждого месяца в полночь), `@weekly` = `0 0 * * 0` (каждое воскресенье в полночь), `@daily`/`@midnight` = `0 0 * * *` (каждый день в полночь), `@hourly` = `0 * * * *` (в начале каждого часа). Этот инструмент распознаёт их все и обрабатывает точно так же, как их развёрнутый эквивалент из 5 полей.

    Можно ли использовать названия дней/месяцев вместо чисел?

    Да. Поле месяца принимает трёхбуквенные имена от `JAN` до `DEC`, а поле дня недели — от `SUN` до `SAT` (без учёта регистра), взаимозаменяемо с числами. Числа дней недели идут от 0 до 6, где 0 = воскресенье; некоторые реализации также принимают 7 для воскресенья, которое этот инструмент нормализует в 0. Диапазоны и списки также работают с именами, например `MON-FRI` или `JAN,JUN,DEC`.

    Отправляется ли моё cron-выражение на сервер?

    Нет. Разбор, описание на понятном языке и вычисление следующего момента запуска — всё происходит локально на JavaScript в вашем браузере. Ничего из введённого или сгенерированного не покидает ваше устройство.

    В каком часовом поясе рассчитываются следующие моменты запуска?

    Инструмент вычисляет следующие запуски исходя из локального часового пояса, установленного в вашем браузере. Если реальный демон cron или CI/CD-раннер работает в другом поясе (например, в UTC), показанное здесь время может не совпадать с фактическим запуском — стоит отдельно проверить часовой пояс, настроенный на продакшен-планировщике.

    Можно ли вставить сгенерированное выражение прямо в YAML GitHub Actions?

    Да, сгенерированное выражение из 5 полей совместимо с синтаксисом, который ожидает поле `schedule:` в GitHub Actions. Но учтите, что cron в GitHub Actions всегда вычисляется в UTC — если нужно, чтобы задача запускалась в конкретное московское время, заранее пересчитайте разницу с UTC перед генерацией выражения.

    Можно ли задать расписание «в последний день каждого месяца» этим синтаксисом?

    Нет. В стандартном cron из 5 полей, который генерирует этот инструмент, нет специального символа для «последнего дня» (это возможность Quartz cron, символ `L`). Чтобы обработать конец месяца в стандартном cron, обычно указывают диапазон `28-31` и добавляют в сам скрипт проверку, действительно ли текущая дата — последний день месяца.

    Почему ночная задача иногда запускается на час раньше или позже ожидаемого?

    Скорее всего, часовой пояс сервера или контейнера отличается от того, что вы проверяли при разработке. На серверах в регионах с переходом на летнее время расписание может смещаться на час дважды в год — поэтому надёжнее составлять выражение в UTC и переводить время в локальный часовой пояс уже внутри самого приложения.

    Похожие инструменты