Выражения cron на первый взгляд кажутся загадочными — пять полей, разделённых пробелами и заполненных звёздочками, числами, косыми чертами и запятыми. Но в каждом поле есть последовательная логика, и однажды поняв её, вы будете легко читать и писать расписания cron. Это руководство разбирает каждую часть синтаксиса cron, объясняет специальные символы, показывает самые распространённые шаблоны расписаний и представляет инструменты, которые разбирают, проверяют и симулируют выражения cron до их развёртывания.
Что такое выражение cron?
Выражение cron — это строка из пяти (иногда шести) полей, разделённых пробелами, которая определяет повторяющееся расписание для автоматизированных задач. Формат был изобретён вместе с демоном cron в Unix в начале 1970-х годов и с тех пор практически не изменился. Сегодня он используется в файлах crontab Linux, в CI/CD-конвейерах вроде GitHub Actions и GitLab CI, в облачных планировщиках вроде AWS EventBridge и Google Cloud Scheduler, в оркестраторах контейнеров вроде Kubernetes CronJob, а также в фреймворках приложений вроде Spring и Quartz.
Анатомия выражения cron
Стандартный формат из пяти полей:
┌----------- минута (0-59)
│ ┌--------- час (0-23)
│ │ ┌------- день месяца (1-31)
│ │ │ ┌----- месяц (1-12)
│ │ │ │ ┌--- день недели (0-7, воскресенье = 0 или 7)
│ │ │ │ │
* * * * * команда для выполненияПоля читаются слева направо: минута, час, день месяца, месяц, день недели. Выражение «0 9 * * 1-5» срабатывает в 09:00 каждый рабочий день. Каждое поле может содержать одиночное значение, список через запятую, диапазон, шаг, подстановочный знак или их комбинацию. Понимание этих операторов — и есть весь навык чтения cron.
Note
Синтаксис cron: поле за полем
Каждое поле имеет определённый диапазон допустимых целых значений. Значения вне допустимого диапазона приводят к ошибке или тихой неправильной настройке в зависимости от реализации cron. Понимание допустимых диапазонов каждого поля — основа чтения любого выражения cron.
Допустимые диапазоны полей
- Минута — от 0 до 59. Значение 0 — начало часа; значение 59 — минута до следующего часа.
- Час — от 0 до 23. 24-часовой формат: 0 — полночь, 12 — полдень, 23 — 11 вечера.
- День месяца — от 1 до 31. Дни нумеруются с 1. В некоторых месяцах меньше дней — в феврале 28 или 29, в апреле/июне/сентябре/ноябре — 30.
- Месяц — от 1 до 12. Январь — 1, декабрь — 12. Некоторые реализации также принимают трёхбуквенные сокращения: JAN, FEB, MAR и т. д.
- День недели — от 0 до 7. И 0, и 7 означают воскресенье. Понедельник — 1, суббота — 6. Некоторые реализации поддерживают MON, TUE, WED, THU, FRI, SAT, SUN.
Как взаимодействуют поля
Пять полей вычисляются вместе как логическое И — задача выполняется, когда все поля без подстановочных знаков совпадают одновременно. «0 9 15 * *» срабатывает ровно в 09:00 15-го числа каждого месяца. Критическое исключение: когда и день месяца, и день недели заданы без подстановочных знаков, в этом случае большинство демонов cron срабатывают, если верно ЛЮБОЕ из условий (логическое ИЛИ), а не оба. Это печально известный источник неожиданного поведения.
Warning
Специальные символы
Мощь cron исходит от его специальных символов — операторов, превращающих фиксированные значения в гибкие шаблоны расписаний. Владение этими шестью операторами покрывает практически все шаблоны планирования, с которыми вы столкнётесь.
Шесть основных операторов
| Символ | Название | Пример | Значение |
|---|---|---|---|
| * | Подстановочный знак | * в минутах | Любое допустимое значение (0-59 для минут) |
| , | Список | 1,15,30 в минутах | В минуты 1, 15 и 30 |
| - | Диапазон | 1-5 в дне недели | С понедельника по пятницу (дни 1–5) |
| / | Шаг | */15 в минутах | Каждые 15 минут (0, 15, 30, 45) |
| ? | Без значения | ? в дне месяца | Без конкретного значения (только Quartz/Spring) |
| @ | Макрос | @daily | Сокращённые псевдонимы (@daily = 0 0 * * *) |
Комбинирование операторов
Операторы можно комбинировать внутри одного поля. «0,30 9-17 * * 1-5» означает «в минуты 0 и 30 каждого часа с 9 утра до 5 вечера, с понедельника по пятницу». Синтаксис шага применяется и к диапазону: «0-30/5» в поле минут означает каждые 5 минут от минуты 0 до минуты 30 (0, 5, 10, 15, 20, 25, 30). Переводчик Cron в Человеческий Язык разбирает любую комбинацию на понятный язык с объяснением каждого поля.
Tip
Распространённые шаблоны расписаний cron
Большинство реальных расписаний cron укладывается в несколько повторяющихся шаблонов. Зная эти шаблоны в лицо, вы сможете читать большинство боевых crontabs без справочника.
- "* * * * *" — Каждую минуту. Самый частый из возможных расписаний. Используется для проверок «сердцебиения» и мониторинга.
- "*/5 * * * *" — Каждые 5 минут. Распространено для задач опроса и прогрева кэша.
- "0 * * * *" — Каждый час ровно. Стандарт для почасовых пакетных процессов.
- "0 0 * * *" — Ежедневно в полночь (UTC). По умолчанию для ежедневных задач очистки.
- "0 9 * * 1-5" — 9 утра каждый рабочий день. Стандартное расписание рабочих часов.
- "0 0 1 * *" — Полночь 1-го числа каждого месяца. Месячные запуски биллинга, генерация отчётов.
- "0 0 1 1 *" — Полночь 1 января. Годовые задачи — продления лицензий, отчёты за год.
- "0 0 * * 0" — Полночь каждое воскресенье. Еженедельные окна обслуживания.
Построение собственных расписаний из шаблонов
Большинство сложных расписаний — это комбинации этих шаблонов. «0 2 * * 6,0» означает «2 часа ночи в субботу и воскресенье» — окно обслуживания на выходных. «*/10 8-18 * * 1-5» означает «каждые 10 минут с 8 утра до 6 вечера, только по рабочим дням». Если вы знаете целевое расписание на понятном языке, Crontab Expression Builder позволяет настроить каждое поле визуально и генерирует правильное выражение с читаемым подтверждением и следующими пятью запусками.
Crontab Expression Builder
Создавайте выражения cron визуально: 15 шаблонов, 5 режимов полей, мгновенное описание понятным языком и предпросмотр следующих 5 запусков — бесплатно, без регистрации.
Как создавать и проверять выражения cron
Писать выражение cron с нуля и надеяться, что оно правильное, рискованно. Одно переставленное поле или неверно понятый оператор могут заставить задачу запускаться в совершенно неподходящие времена — или не запускаться вовсе. Эти инструменты устраняют этот риск.
Напишите или выберите выражение
Откройте Crontab Expression Builder и либо введите выражение напрямую, либо выберите одну из 15 встроенных шаблонов. Каждый шаблон покрывает распространённый паттерн расписания (каждую минуту, ежечасно, ежедневно, рабочие дни, ежемесячно) и может быть настроен визуальными элементами управления полей без правки сырого выражения.
Проверьте синтаксические ошибки
Вставьте выражение в Валидатор Выражений Cron. Он проверяет каждое поле на соответствие допустимому диапазону, проверяет границы диапазонов (начало должно быть меньше конца), подтверждает, что значения шага не равны нулю, и отмечает макросы, не поддерживаемые стандартным crontab из 5 полей. Каждая ошибка сопровождается сообщением уровня строки, объясняющим, чего ожидал парсер.
Переведите на понятный язык
Пропустите проверенное выражение через Переводчик Cron в Человеческий Язык. Результат — полное предложение понятным языком, описывающее расписание, — «В 2:30 ночи, в понедельник, среду и пятницу» — плюс разбор по полям. Если описание не совпадает с вашим замыслом, исправьте выражение до развёртывания.
Смоделируйте 12 месяцев запусков
Для запланированных задач, где важен момент — запуски биллинга, экспорты данных, окна обслуживания — откройте Interactive Cron Scheduler и смоделируйте выражение на следующие 12 месяцев. Календарный вид показывает плотность запусков по месяцам, а временная шкала — точные метки времени. Убедитесь, что расписание срабатывает в ожидаемые даты, прежде чем переносить конфигурацию в продакшн.
Валидатор Выражений Cron
Проверяйте синтаксис cron из 5 полей, диапазоны, шаги, списки значений и макросы с мгновенной диагностикой по каждому полю — локально в браузере, бесплатно, без регистрации.
Cron в CI/CD и облачных планировщиках
Синтаксис cron используется далеко за пределами crontab Linux. Современные CI/CD и облачные платформы приняли тот же формат из 5 полей, но у каждой свои особенности обработки часовых поясов, поддержки макросов и ограничений минимального интервала.
Различия по платформам
| Платформа | Поля | Часовой пояс | Макросы | Мин. интервал |
|---|---|---|---|---|
| Linux crontab | 5 | Системный локальный | ✓ Все 6 | Каждую минуту |
| GitHub Actions | 5 | Только UTC | ✗ Нет | Каждые 5 мин (принудительный сдвиг до 15 мин) |
| GitLab CI | 5 | Только UTC | ✓ Частично | Каждую минуту |
| AWS EventBridge | 5 или 6 | Только UTC | ✗ Нет | Каждую минуту |
| Google Cloud Scheduler | 5 или unix | Любой пояс IANA | ✓ Некоторые | Каждую минуту |
| Kubernetes CronJob | 5 | Пояс кластера | ✗ Нет | Каждую минуту |
| Spring Scheduler | 6 | По умолчанию JVM | ✓ Да | Каждую секунду |
Планирование cron в GitHub Actions
GitHub Actions использует стандартный синтаксис cron из 5 полей, но всегда работает в UTC. Если вам нужна задача в 9 утра по восточному времени (UTC-5), вы пишете «0 14 * * *». GitHub Actions также не поддерживает синтаксис макросов (@daily, @weekly), поэтому используйте полное выражение. Запланированные workflow в периоды высокой нагрузки могут запускаться с опозданием до 15 минут — проектируйте задачи с учётом этого сдвига.
Преобразование cron в таймеры systemd
Современные Linux-системы всё чаще используют таймеры systemd вместо классического crontab. Формат OnCalendar в systemd использует другой синтаксис, но покрывает те же шаблоны. Конвертер Cron в Таймер Systemd преобразует любое выражение cron из 5 полей в эквивалентную конфигурацию юнита таймера systemd, включая полный шаблон файлов .timer и .service.
Подводные камни и крайние случаи cron
Даже опытные разработчики сталкиваются с тихими сбоями cron. Вот самые распространённые подводные камни — каждый из них стоил продакшн-системам незамеченных простоев или дублирующихся запусков задач.
Сюрпризы часовых поясов
Cron по умолчанию работает в локальном часовом поясе сервера. Если ваш сервер в UTC, а бизнес в Нью-Йорке (UTC-5), «0 9 * * *» сработает в 4 утра по местному времени, а не в 9 утра. Облачные платформы вроде GitHub Actions и AWS EventBridge всегда работают в UTC, так что вся арифметика часовых поясов ложится на вас. Всегда подтверждайте часовой пояс перед развёртыванием расписания. Interactive Cron Scheduler позволяет симулировать запуски с учётом смещения часового пояса.
Крайние случаи конца месяца
Планирование задачи на 29, 30 или 31 число заставляет её молча пропускать месяцы, в которых такого дня нет. «0 0 31 * *» никогда не выполняется в апреле, июне, сентябре или ноябре. «0 0 29 2 *» выполняется в феврале только в високосные годы. Если вам нужно расписание «в последний день месяца», нужен более умный подход — либо запускать ежедневно со скриптом, проверяющим дату, либо использовать облачный планировщик с поддержкой синтаксиса L (последний день).
Переходы на летнее время
Переходы на летнее время могут приводить к тому, что задачи cron выполняются дважды или пропускаются. Когда часы переводят вперёд, время внутри пропущенного часа не наступает никогда. Когда часы переводят назад, время в повторяющемся часе наступает дважды. Задачи, запланированные в локальном часовом поясе в окне перехода, затрагиваются. Самая безопасная практика — запускать серверы и планировщики в UTC, где переходов на летнее время никогда не бывает.
Warning
Проблема «каждую секунду»
Стандартный cron из 5 полей имеет минимальное разрешение в одну минуту. Если вам нужно запускать задачу каждые 10 секунд, cron — не тот инструмент: используйте системный таймер, очередь задач с задержками или поле секунд, доступное в Spring Scheduler и Quartz. Попытка приблизить субминутные расписания несколькими записями crontab чревата ошибками и создаёт состояния гонки при перекрытии задач.
Key takeaways
- Выражение cron состоит из пяти полей: минута (0-59), час (0-23), день месяца (1-31), месяц (1-12), день недели (0-7).
- Шесть специальных символов: * (подстановочный знак), , (список), - (диапазон), / (шаг), ? (без значения, только Quartz) и @ (макросы вроде @daily).
- Когда и день месяца, и день недели заданы без подстановочных знаков, большинство демонов cron срабатывают, если совпадает ЛЮБОЕ из них — частая причина неожиданных двойных запусков.
- Используйте Crontab Expression Builder для визуального построения, Валидатор Выражений Cron для проверки синтаксиса и Interactive Cron Scheduler для симуляции 12 месяцев запусков.
- GitHub Actions использует cron из 5 полей только в UTC без поддержки макросов; AWS EventBridge и Google Cloud Scheduler тоже используют UTC; crontab Linux использует системный часовой пояс.
- Не планируйте на 29, 30 или 31 число, если задача должна выполняться каждый месяц — этих дней нет в каждом месяце.
- Стандартный cron имеет минимальное разрешение в одну минуту; для субминутных потребностей используйте таймеры systemd, очереди задач или Spring/Quartz.