Инструменты разработчика
February 14, 20267 min readBy BrowseryTools Team

Cron-выражения простым языком: как читать и писать расписания cron

Синтаксис cron кажется загадочным, пока не разберёшься в пяти полях. Научитесь читать и писать cron-выражения, избегать частых ошибок и мгновенно разбирать любое расписание в браузере.

croncron-выражениепланировщикDevOpsавтоматизацияLinux

Если вы когда-либо развёртывали веб-приложение, настраивали CI/CD-конвейер или управляли сервером Linux, вы почти наверняка сталкивались с cron-выражением. Пять звёздочек, глядящих на вас из файла конфигурации. Загадочная строка вроде 0 2 * * 0, погребённая в workflow GitHub Actions. Расписание AWS EventBridge, которое уже никто в команде до конца не понимает. Cron-выражения повсюду — и они по-настоящему запутанны, если вы не уделили время изучению стоящей за ними системы.

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

Что такое cron?

Cron — это планировщик задач на основе Unix, автоматически запускающий команды или скрипты в заданное время и с заданными интервалами. Название происходит от Хроноса, греческого олицетворения времени — удачный выбор для инструмента, вся цель которого — автоматизация на основе времени. Оригинальный cron был представлен в Unix Version 7 в 1979 году, написан Кеном Томпсоном в Bell Labs, и с тех пор является основой Unix-подобных операционных систем.

Планировщик работает, читая файлы конфигурации, называемые crontab (cron-таблицами) — текстовые файлы, где каждая строка определяет запланированную задачу. Фоновый процесс-демон (crond) просыпается каждую минуту, проверяет все активные crontab и запускает все задачи, чьё расписание совпадает с текущим временем. Это прекрасно простой дизайн, оставшийся принципиально неизменным более четырёх десятилетий.

Где вы встречаете cron сегодня

Cron — не просто реликт Unix-прошлого. Синтаксис cron-выражений является де-факто стандартом для выражения повторяющихся расписаний во всём современном программном стеке:

  • Crontab в Linux и macOS: исходный сценарий. Запустите crontab -e на любой машине Linux или macOS, чтобы отредактировать своё личное расписание cron.
  • GitHub Actions: файлы workflow используют синтаксис cron под триггером schedule:, чтобы запускать CI/CD-конвейеры на повторяющейся основе.
  • AWS EventBridge (ранее CloudWatch Events): запускает функции Lambda, задачи ECS и другие сервисы AWS по расписанию с использованием 6-полевого варианта cron.
  • Kubernetes CronJobs: ресурс CronJob запускает пакетные нагрузки внутри кластера по расписанию cron.
  • CI/CD-конвейеры: GitLab CI, CircleCI, Jenkins и Bitbucket Pipelines — все поддерживают запланированные запуски с использованием cron-выражений.
  • Vercel и Netlify: обе платформы поддерживают запускаемые по cron бессерверные функции для задач вроде инвалидации кэша, получения данных и ночных сборок.
  • Обслуживание баз данных: расширение pg_cron для PostgreSQL, планировщик событий MySQL и управляемые сервисы баз данных используют синтаксис cron для вакуумирования, индексации и задач резервного копирования.
  • Планировщики уровня приложения: библиотеки вроде node-cron, APScheduler (Python), Quartz (Java) и Sidekiq (Ruby) — все используют cron-выражения для определения повторяющихся фоновых задач.

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

Структура из пяти полей

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

┌───────────── минута (0–59)
│ ┌─────────── час (0–23)
│ │ ┌───────── день месяца (1–31)
│ │ │ ┌─────── месяц (1–12)
│ │ │ │ ┌───── день недели (0–7)
│ │ │ │ │
* * * * *

Читая слева направо: минута, час, день месяца, месяц, день недели. Звёздочка (*) в любом поле означает «каждое возможное значение для этого поля». Так что * * * * * означает «каждую минуту каждого часа каждого дня» — самое разрешительное расписание из возможных.

Поле 1: минута (0–59)

Поле минуты управляет тем, в какую минуту (минуты) внутри часа срабатывает задача. Значение 0означает в начале часа, 30 означает в половину часа, а * означает каждую минуту. Это самое детальное поле в стандартном cron — наименьшая единица планирования составляет одну минуту.

Поле 2: час (0–23)

Поле часа использует 24-часовое время. 0 — это полночь, 9 — это 9 утра,17 — это 5 вечера, а 23 — это 11 вечера. Нет AM/PM — всё в 24-часовом формате. Помните, что cron всегда работает в часовом поясе сервера, если явно не настроено иначе.

Поле 3: день месяца (1–31)

Управляет тем, в какой день (дни) месяца запускается задача. 1 — это первое, 15 — пятнадцатое, 31 — тридцать первое. Будьте осторожны со значениями вроде 31 — в месяцах с меньшим числом дней (февраль, апрель, июнь и т. д.) задача, запланированная на 31-е, просто не запустится в этом месяце. Некоторые реализации поддерживают специальный символ L в значении «последний день месяца» независимо от того, сколько дней в месяце.

Поле 4: месяц (1–12)

Поле месяца использует числовые значения (1 для января по 12 для декабря) или трёхбуквенные сокращения (JAN, FEB, MAR, APR, MAY, JUN,JUL, AUG, SEP, OCT, NOV, DEC) в большинстве реализаций. Звёздочка означает «каждый месяц».

Поле 5: день недели (0–7)

Это поле указывает, в какой день (дни) недели задача должна запускаться. Нумерация здесь — частый источник путаницы: и 0, и 7 представляют воскресенье в большинстве реализаций cron (наследие оригинального дизайна Unix). Понедельник — 1, вторник — 2, а суббота — 6. Трёхбуквенные сокращения (SUN, MON, TUE, WED, THU, FRI,SAT) поддерживаются в большинстве современных инструментов cron.

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

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

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

* — подстановочный знак (каждое значение)

Звёздочка означает «совпадать с каждым возможным значением в этом поле». В поле минуты *означает каждую минуту (с 0 по 59). В поле месяца — каждый месяц. Это значение по умолчанию «мне всё равно, какое это поле».

* * * * *    # Runs every single minute, all day, every day

, — список (несколько значений)

Запятая разделяет список конкретных значений. Поле совпадает, если текущее время совпадает с любым значением в списке. Так вы планируете задачу на запуск в несколько отдельных моментов времени без использования диапазона.

0 9,13,17 * * *    # Runs at 9:00 AM, 1:00 PM, and 5:00 PM every day
0 0 1,15 * *       # Runs at midnight on the 1st and 15th of every month

- — диапазон (с по)

Дефис определяет включительный диапазон значений. Поле совпадает с каждым значением между началом и концом включительно. Это идеально для выражения вещей вроде «в рабочие часы» или «по будням».

0 9-17 * * *      # Runs at the top of every hour from 9 AM through 5 PM
0 0 * * 1-5       # Runs at midnight every Monday through Friday

/ — шаг (каждые N единиц)

Косая черта определяет значение шага. */5 означает «каждые 5 единиц начиная с минимума». Вы также можете комбинировать его с диапазоном: 0-30/10 означает «каждые 10 единиц между 0 и 30» (то есть 0, 10, 20, 30). Шаги — один из наиболее часто используемых специальных символов.

*/5 * * * *       # Every 5 minutes (0, 5, 10, 15, ... 55)
*/15 * * * *      # Every 15 minutes (0, 15, 30, 45)
0 */6 * * *       # Every 6 hours (0:00, 6:00, 12:00, 18:00)
0/15 * * * *      # Same as */15 — starts from 0, every 15 minutes

L — последний (только некоторые реализации)

Символ L поддерживается в некоторых реализациях cron (в частности, Quartz Scheduler в Java и некоторых вариантах Linux cron) в значении «последний». В поле дня месяца L означает последний день текущего месяца — будь то 28-е, 29-е, 30-е или 31-е. Это решает проблему планирования задач «на конец месяца», не зная заранее длину месяца.

0 0 L * *         # Midnight on the last day of every month (Quartz/some crons)

? — нет конкретного значения (Quartz/Java cron)

Знак вопроса используется в Quartz Scheduler (Java) и некоторых других инструментах, когда вы хотите указать день недели без указания дня месяца, или наоборот. Поскольку логически не имеет смысла указывать оба (скажем, «15-е И среда»), один из них должен быть установлен в ?, чтобы обозначить «мне всё равно». Стандартный Unix cron не использует этот символ — вместо него используется *.

0 9 15 * ?        # Quartz: 9 AM on the 15th, day-of-week unspecified
0 9 ? * MON       # Quartz: 9 AM every Monday, day-of-month unspecified

10 реальных примеров cron

Лучший способ закрепить понимание — изучить реальные примеры с контекстом того, почему было выбрано каждое расписание. Вот десять шаблонов, с которыми вы будете сталкиваться (и которые будете использовать) регулярно.

1. Каждый будний день в 9:00

0 9 * * 1-5

Минута — 0 (начало часа), час — 9 (9 утра), день месяца и месяц — подстановочные знаки, а день недели — 1-5 (с понедельника по пятницу). Используется для напоминаний о ежедневных стендапах, отчётных писем, отправляемых в начале рабочего дня, и утренних задач синхронизации данных, которые не должны выполняться по выходным.

2. Каждые 15 минут

*/15 * * * *

Синтаксис шага */15 в поле минуты даёт запуски на 0, 15, 30 и 45 минутах каждого часа, круглосуточно. Распространён для пингов проверки работоспособности, прогрева кэша, повторов webhook и любой близкой к реальному времени задачи опроса, где нужна свежесть, но истинное реальное время избыточно или недоступно.

3. Каждый день в полночь

0 0 * * *

Минута 0, час 0, всё остальное — подстановочный знак. Это один из самых распространённых шаблонов cron из существующих. Используется для ежедневной генерации отчётов, ротации логов, архивации БД, очистки временных файлов, отправки ежедневных дайджест-писем и любой задачи «раз в день», которая должна выполняться вне рабочих часов.

4. Первый день каждого месяца в полночь

0 0 1 * *

День месяца — 1, всё остальное — подстановочный знак (кроме фиксированных минуты/часа). Это запускается 1 января, 1 февраля, 1 марта и так далее. Основное расписание для ежемесячной генерации счетов, триггеров биллингового цикла, продлений SaaS-подписок и ежемесячных аналитических сводок.

5. Каждое воскресенье в 2:00

0 2 * * 0

День недели 0 — это воскресенье, а час 2 — это 2 ночи — время, когда трафик обычно самый низкий. Используется для еженедельных полных резервных копий БД, регенерации sitemap, переиндексации контента для поиска и тяжёлых пакетных задач, которые повлияли бы на производительность в течение недели.

6. По будням в 8:30, 12:30 и 17:30

30 8,12,17 * * 1-5

Это сочетает список в поле часа с диапазоном в поле дня недели. Минута 30 означает, что задача срабатывает в половину часа. Используется для запланированных пакетов уведомлений (push-уведомления, email-дайджесты), задач синхронизации данных три раза в день и любого рабочего процесса, где нужны регулярные точки контакта в течение рабочего дня без долбёжки каждый час.

7. 1 января в полночь

0 0 1 1 *

День месяца 1 и месяц 1 (январь) вместе закрепляют это за Новым годом. Используется для ежегодных задач вроде годовых продлений подписок, архивации данных предыдущего года, генерации годовых отчётов о соответствии и сброса годовых квот или счётчиков в приложениях.

8. Каждые 5 минут в рабочие часы по будням

*/5 9-17 * * 1-5

Составное выражение, сочетающее шаг (*/5), диапазон в часах (9-17) и диапазон в дне недели (1-5). Это даёт агрессивный мониторинг или опрос — каждые 5 минут с 9 утра до 5 вечера с понедельника по пятницу — при этом затихая ночью и по выходным, чтобы экономить ресурсы и избегать усталости от оповещений.

9. Каждые 6 часов

0 */6 * * *

Шаг в поле часа (*/6) даёт четыре равномерно распределённых запуска в день: полночь, 6 утра, полдень и 6 вечера. Используется для синхронизации данных между системами, обновления долгоживущих API-токенов или учётных данных OAuth до их истечения и периодической инвалидации кэша для контента, меняющегося несколько раз в день, но не нуждающегося в свежести с точностью до минуты.

10. 15-е и последний день каждого месяца

0 0 15,L * *

Список через запятую в поле дня месяца, сочетающий фиксированную дату (15) и сокращение последнего дня (L). Это классическое расписание полумесячной зарплаты — платёжные периоды, заканчивающиеся 15-го и в последний день месяца. Учтите, что L требует реализации, которая его поддерживает (Quartz, некоторые Linux cron); стандартный crontab не поддерживает L.

Частые ошибки и подвохи

У cron-выражений есть несколько хорошо известных ловушек, вызывающих инциденты в продакшене. Понимание их заранее избавит вас от болезненной сессии отладки в 2 часа ночи.

Нумерация дня недели не универсальна

Большинство реализаций Unix cron трактуют и 0, и 7 как воскресенье. Но некоторые инструменты (включая определённые библиотеки уровня приложения) начинают неделю с понедельника, делая1 = понедельник и 7 = воскресенье. Всегда проверяйте соглашение о нумерации для конкретного используемого инструмента и предпочитайте трёхбуквенные сокращения (MON,TUE и т. д.), когда реализация их поддерживает, чтобы устранить неоднозначность.

Cron работает в часовом поясе сервера

Это, вероятно, самый частый источник cron-багов в продакшене. 0 9 * * * означает 9 утра в часовом поясе машины, выполняющей задачу — которым может быть UTC, US/Eastern или что угодно ещё. Всегда документируйте предположение о часовом поясе в комментарии рядом с cron-выражением. Для облачных планировщиков явно настраивайте часовой пояс, если платформа это поддерживает.

# Good practice: always document the timezone
# Runs at 9 AM US/Eastern (UTC-5 or UTC-4 during DST)
0 14 * * 1-5   # 9 AM ET expressed in UTC

Cron в GitHub Actions всегда работает по UTC

GitHub Actions использует стандартный 5-полевый синтаксис cron под ключом on: schedule:, но планировщик всегда работает в UTC — опции настройки часового пояса нет. Если вы хотите, чтобы задача запускалась в 9 утра по восточному времени, вам нужно запланировать её на 0 14 * * * (UTC). Также учтите, что запланированные workflow GitHub Actions могут запускаться с задержкой до 15 минут в периоды высокого спроса.

Синтаксис шага применяется к своему полю, а не к минутам

Частое неверное прочтение: */5 в поле часа означает каждые 5 часов — а не каждые 5 минут. Шаг всегда применяется к единице того поля, в котором находится. */5 в поле минуты — каждые 5 минут; в поле часа — каждые 5 часов; в поле месяца — каждые 5 месяцев.

Задачи, выполняющиеся дольше своего интервала, могут пересекаться

Cron — это планировщик «запустил и забыл». Если вы планируете задачу каждые 5 минут, а экземпляр задачи выполняется 7 минут, второй экземпляр запустится, пока первый ещё работает. Это может вызвать состояния гонки, дублирующую обработку и повреждение данных. Используйте файловую блокировку или рекомендательную блокировку в вашей базе данных, чтобы предотвратить одновременное выполнение одной задачи.

Отсутствующие поля и подстановочные знаки не всегда эквивалентны

В некоторых расширенных реализациях cron (особенно Quartz) пропуск поля и использование *трактуются по-разному. Всегда явно используйте все требуемые поля и никогда не полагайтесь на значения по умолчанию для критичных продакшен-расписаний.

Нестандартные расширения: 6-полевой cron

У стандартного Unix cron пять полей с минутой как наибольшей детализацией. Несколько систем расширяют это дополнительными полями:

Поле секунд (в начале)

Многие планировщики уровня приложения (node-cron, Quartz, Spring Scheduler) добавляют поле секунд в начало, давая 6 полей. Это позволяет планирование с точностью меньше минуты, вплоть до секунды. Поля таковы: second minute hour day-of-month month day-of-week.

# 6-field cron with seconds prepended (Quartz / node-cron)
0 */5 * * * *    # Every 5 minutes (second=0, minute=*/5, ...)
30 0 9 * * 1-5   # Weekdays at 9:00:30 AM

AWS EventBridge (6 полей с годом)

AWS EventBridge использует 6-полевой формат, где поле года добавляется в конец:minute hour day-of-month month day-of-week year. Он также требует использования ?для либо дня месяца, либо дня недели (никогда оба как подстановочные знаки одновременно). AWS EventBridge не поддерживает синтаксис шага */ так же, как Unix cron.

# AWS EventBridge cron format (6 fields, year at end)
cron(0 9 ? * MON-FRI *)    # Weekdays at 9 AM UTC, any year
cron(0 0 1 * ? *)           # First day of every month at midnight
Быстрый совет: копируя cron-выражение между платформами, всегда проверяйте число полей и любые специфичные для платформы различия синтаксиса. Действительное cron-выражение Unix может быть недействительным (или означать иное) в AWS EventBridge, Quartz или контексте node-cron.

Как пользоваться разборщиком cron BrowseryTools

Написать cron-выражение с нуля — один навык; убедиться, что вы написали его правильно — другой. Разборщик cron BrowseryTools делает тривиальной проверку любого выражения до того, как оно приблизится к продакшену.

Вставьте любое 5-полевое (или 6-полевое) cron-выражение в инструмент и мгновенно получите:

  • Читаемое человеком описание расписания («Каждый будний день в 9:00»), чтобы вы могли с одного взгляда убедиться, что ваше намерение совпадает с выражением.
  • Явно перечисленные следующие 5–10 запланированных времён запуска, чтобы вы могли точно увидеть, когда задача сработает, и подтвердить отсутствие сюрпризов.
  • Мгновенную обратную связь о недопустимом синтаксисе — полезно, если у вас опечатка или вы работаете с выражением, которое написал кто-то другой.

Всё работает полностью в вашем браузере — ни одно выражение не отправляется на сервер. Это самый быстрый способ проверить здравомыслие расписания перед развёртыванием в GitHub Actions, Kubernetes или на любой другой платформе.

Справочная таблица cron-выражений

Используйте эту таблицу как быстрый справочник. Добавьте эту страницу в закладки и возвращайтесь к ней всякий раз, когда нужно найти шаблон или проверить, что означает выражение.

ВыражениеЧитаемое значениеТипичный сценарий
* * * * *Каждую минутуВысокочастотный опрос, тестирование
*/5 * * * *Каждые 5 минутПроверки работоспособности, прогрев кэша
*/15 * * * *Каждые 15 минутСинхронизация данных, повторы webhook
0 * * * *Каждый час в начале часаПочасовые агрегации, вызовы API
0 */6 * * *Каждые 6 часовОбновление токенов, синхронизация данных
0 0 * * *Каждый день в полночьЕжедневные отчёты, ротация логов
0 9 * * 1-5По будням в 9:00Задачи рабочих часов, напоминания
0 2 * * 0Каждое воскресенье в 2:00Еженедельные бэкапы, обслуживание
0 0 1 * *Первое число каждого месяца в полночьЕжемесячные счета, биллинг
0 0 1,15 * *1-го и 15-го каждого месяцаПолумесячная зарплата
0 0 1 1 *1 января в полночьЕжегодные задачи, годовой сброс
30 8,12,17 * * 1-5По будням в 8:30, 12:30, 17:30Пакеты уведомлений
*/5 9-17 * * 1-5Каждые 5 мин в рабочие часы (будни)Активный мониторинг, опрос

Проверяйте cron-выражения перед развёртыванием

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

Двухминутная привычка вставлять своё выражение в валидатор и просматривать следующие несколько запланированных времён запуска перед развёртыванием — одна из самых ценных практик в DevOps и бэкенд-инженерии. Она ловит ошибки до того, как они станут инцидентами.

Проверяйте любое cron-выражение мгновенно — бесплатно, приватно, в браузере

Вставьте своё выражение, получите читаемое описание и посмотрите следующие запланированные времена запуска. Ничто не покидает ваш браузер.

Открыть разборщик cron →

🛠️

Try the Tools — 100% Free, No Sign-Up

Everything runs in your browser. No uploads. No accounts. No ads.

Explore All Tools →