Перейти к содержимому
Aback Tools Logo

Резолвер Cron: Понимание выражений Cron

Как читать, писать и проверять выражения cron: синтаксис поле за полем, специальные символы, распространённые шаблоны расписаний, различия платформ, типичные подводные камни и бесплатные инструменты для разбора и симуляции расписаний.

DH
Tutorials & How-Tos12 мин чтения2,700 слов

Выражения cron на первый взгляд кажутся загадочными — пять полей, разделённых пробелами и заполненных звёздочками, числами, косыми чертами и запятыми. Но в каждом поле есть последовательная логика, и однажды поняв её, вы будете легко читать и писать расписания cron. Это руководство разбирает каждую часть синтаксиса cron, объясняет специальные символы, показывает самые распространённые шаблоны расписаний и представляет инструменты, которые разбирают, проверяют и симулируют выражения cron до их развёртывания.

5Стандартные поля cronминута, час, день месяца, месяц, день недели
15+Встроенные шаблоны расписанийв Crontab Expression Builder
12moГоризонт симуляциив Interactive Cron Scheduler

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

Выражение cron — это строка из пяти (иногда шести) полей, разделённых пробелами, которая определяет повторяющееся расписание для автоматизированных задач. Формат был изобретён вместе с демоном cron в Unix в начале 1970-х годов и с тех пор практически не изменился. Сегодня он используется в файлах crontab Linux, в CI/CD-конвейерах вроде GitHub Actions и GitLab CI, в облачных планировщиках вроде AWS EventBridge и Google Cloud Scheduler, в оркестраторах контейнеров вроде Kubernetes CronJob, а также в фреймворках приложений вроде Spring и Quartz.

Анатомия выражения cron

Стандартный формат из пяти полей:

формат выражения cron
text
┌----------- минута        (0-59)
│ ┌--------- час          (0-23)
│ │ ┌------- день месяца  (1-31)
│ │ │ ┌----- месяц         (1-12)
│ │ │ │ ┌--- день недели   (0-7, воскресенье = 0 или 7)
│ │ │ │ │
* * * * *   команда для выполнения

Поля читаются слева направо: минута, час, день месяца, месяц, день недели. Выражение «0 9 * * 1-5» срабатывает в 09:00 каждый рабочий день. Каждое поле может содержать одиночное значение, список через запятую, диапазон, шаг, подстановочный знак или их комбинацию. Понимание этих операторов — и есть весь навык чтения cron.

Note

Некоторые платформы используют формат из 6 полей, добавляя поле секунд в позицию 0 (перед минутами). Этот формат используют Spring Scheduler и Quartz. AWS EventBridge и большинство демонов cron в Unix используют 5 полей. Всегда проверяйте, какой формат ожидает ваша целевая платформа — выражение, написанное для одной, может молча создать неправильное расписание на другой.

Синтаксис 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 9 1 * 1» НЕ означает «первый понедельник месяца в 09:00» — оно означает «09:00 1-го числа месяца, ИЛИ 09:00 в любой понедельник». Используйте скрипт или управляемый планировщик с логикой, учитывающей календарь, если вам нужна настоящая семантика «первого понедельника месяца».

Специальные символы

Мощь 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, разбирайте каждое поле слева направо и переводите его независимо. Сначала поле минут, затем час, затем день месяца, затем месяц, затем день недели. Читайте каждое поле без звёздочки как ограничение: «только когда минута = X», «только когда час = Y» и т. д. Собранное в обратном порядке, справа налево, это читается как предложение.

Распространённые шаблоны расписаний cron

Большинство реальных расписаний cron укладывается в несколько повторяющихся шаблонов. Зная эти шаблоны в лицо, вы сможете читать большинство боевых crontabs без справочника.

  1. "* * * * *" — Каждую минуту. Самый частый из возможных расписаний. Используется для проверок «сердцебиения» и мониторинга.
  2. "*/5 * * * *" — Каждые 5 минут. Распространено для задач опроса и прогрева кэша.
  3. "0 * * * *" — Каждый час ровно. Стандарт для почасовых пакетных процессов.
  4. "0 0 * * *" — Ежедневно в полночь (UTC). По умолчанию для ежедневных задач очистки.
  5. "0 9 * * 1-5" — 9 утра каждый рабочий день. Стандартное расписание рабочих часов.
  6. "0 0 1 * *" — Полночь 1-го числа каждого месяца. Месячные запуски биллинга, генерация отчётов.
  7. "0 0 1 1 *" — Полночь 1 января. Годовые задачи — продления лицензий, отчёты за год.
  8. "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 запусков — бесплатно, без регистрации.

Open tool

Как создавать и проверять выражения cron

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

1

Напишите или выберите выражение

Откройте Crontab Expression Builder и либо введите выражение напрямую, либо выберите одну из 15 встроенных шаблонов. Каждый шаблон покрывает распространённый паттерн расписания (каждую минуту, ежечасно, ежедневно, рабочие дни, ежемесячно) и может быть настроен визуальными элементами управления полей без правки сырого выражения.

2

Проверьте синтаксические ошибки

Вставьте выражение в Валидатор Выражений Cron. Он проверяет каждое поле на соответствие допустимому диапазону, проверяет границы диапазонов (начало должно быть меньше конца), подтверждает, что значения шага не равны нулю, и отмечает макросы, не поддерживаемые стандартным crontab из 5 полей. Каждая ошибка сопровождается сообщением уровня строки, объясняющим, чего ожидал парсер.

3

Переведите на понятный язык

Пропустите проверенное выражение через Переводчик Cron в Человеческий Язык. Результат — полное предложение понятным языком, описывающее расписание, — «В 2:30 ночи, в понедельник, среду и пятницу» — плюс разбор по полям. Если описание не совпадает с вашим замыслом, исправьте выражение до развёртывания.

4

Смоделируйте 12 месяцев запусков

Для запланированных задач, где важен момент — запуски биллинга, экспорты данных, окна обслуживания — откройте Interactive Cron Scheduler и смоделируйте выражение на следующие 12 месяцев. Календарный вид показывает плотность запусков по месяцам, а временная шкала — точные метки времени. Убедитесь, что расписание срабатывает в ожидаемые даты, прежде чем переносить конфигурацию в продакшн.

Валидатор Выражений Cron

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

Open tool

Cron в CI/CD и облачных планировщиках

Синтаксис cron используется далеко за пределами crontab Linux. Современные CI/CD и облачные платформы приняли тот же формат из 5 полей, но у каждой свои особенности обработки часовых поясов, поддержки макросов и ограничений минимального интервала.

Различия по платформам

ПлатформаПоляЧасовой поясМакросыМин. интервал
Linux crontab5Системный локальный✓ Все 6Каждую минуту
GitHub Actions5Только UTC✗ НетКаждые 5 мин (принудительный сдвиг до 15 мин)
GitLab CI5Только UTC✓ ЧастичноКаждую минуту
AWS EventBridge5 или 6Только UTC✗ НетКаждую минуту
Google Cloud Scheduler5 или unixЛюбой пояс IANA✓ НекоторыеКаждую минуту
Kubernetes CronJob5Пояс кластера✗ НетКаждую минуту
Spring Scheduler6По умолчанию 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 для однократного, критичного по времени выполнения. Демоны cron могут пропустить запуск, если система выключена, перезагружается, находится под высокой нагрузкой или часы были переведены. Для финансовых транзакций идемпотентный дизайн задач и очередь задач с обработкой недоставленных сообщений надёжнее сырого планирования cron.

Проблема «каждую секунду»

Стандартный 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.

Частые вопросы

A cron resolver is a tool that parses a cron expression and translates it into a human-readable schedule description and a list of the next scheduled run times. Given an expression like "0 9 * * 1-5", a resolver tells you "At 09:00 AM, Monday through Friday" and shows you the next five dates and times the job will fire. The Aback Tools Cron to Human-Readable Translator and Interactive Cron Scheduler both perform this resolution instantly in your browser without uploading anything to a server.

The five fields are minute (0-59), hour (0-23), day of month (1-31), month (1-12), and day of week (0-7, where both 0 and 7 represent Sunday). They run left to right in that order. The expression "30 8 * * 1" means "At 8:30 AM, every Monday." An asterisk (*) in any field means "every valid value for that field." Most standard crontab implementations use exactly these five fields; some extended formats (Spring Scheduler, Quartz) add a sixth seconds field at the start.

An asterisk (*) is the wildcard character in cron - it means "match every valid value for this field." In the minute field, * means every minute (0-59). In the hour field, * means every hour (0-23). In the day-of-week field, * means every day. So "* * * * *" runs every minute of every hour every day. It is the broadest possible value for any field. Use it when a field should not restrict the schedule rather than listing every value explicitly.

Range syntax specifies a span of consecutive values: "1-5" in the day-of-week field means Monday through Friday. Step syntax uses a forward slash to specify an interval: "*/15" in the minute field means every 15 minutes (0, 15, 30, 45). They can be combined: "0-30/10" means every 10 minutes from minute 0 to minute 30 (0, 10, 20, 30). Step syntax is commonly used to run jobs at regular intervals without listing every value explicitly.

Use the step syntax in the minute field: "*/5 * * * *". This expression fires at minutes 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, and 55 of every hour, every day. If you need to run every 5 minutes but only during business hours (9 AM to 5 PM, Monday to Friday), use "*/5 9-17 * * 1-5". Validate the expression in the Cron Expression Validator and preview the exact fire times in the Interactive Cron Scheduler before deploying.

Cron macros are shorthand aliases for common schedule expressions. The most widely supported are @reboot (run once at startup), @yearly or @annually ("0 0 1 1 *"), @monthly ("0 0 1 * *"), @weekly ("0 0 * * 0"), @daily or @midnight ("0 0 * * *"), and @hourly ("0 * * * *"). Support varies by scheduler - Linux crontab and most Unix cron daemons support all six; AWS EventBridge, Google Cloud Scheduler, and GitHub Actions do not support macro syntax. The Cron to Human-Readable Translator handles macros and expands them to their equivalent expressions.

The most common causes are timezone mismatch (cron runs in the server's local timezone, often UTC), off-by-one in day-of-week numbering (0 and 7 both mean Sunday on most systems, but not all), and the interaction between day-of-month and day-of-week fields (when both are non-wildcard, most cron implementations fire if EITHER condition is true, not both). Use the Interactive Cron Scheduler to simulate the exact fire times in UTC versus your expected timezone before concluding there is a bug.

Yes. GitHub Actions supports cron scheduling via the `schedule` trigger with a `cron:` key using standard 5-field cron syntax. GitHub Actions runs on UTC, so adjust your expression accordingly. Note that GitHub Actions does not support cron macros (@daily, @weekly, etc.) - use the full 5-field expression instead. Also, scheduled workflows may not run at exactly the specified time during periods of high load; expect up to 15 minutes of drift. The Crontab Expression Builder generates GitHub Actions-compatible expressions with next run time previews.

ShareXLinkedIn