Что такое cron expression
Как устроено классическое cron expression из пяти полей, что означают звёздочка, диапазоны, списки и шаги, как читать расписание и не ошибаться с day-of-month/day-of-week.

Cron expression — это компактная запись расписания выполнения задачи. В классическом Unix/Vixie-style crontab первые пять полей задают минуту, час, день месяца, месяц и день недели, после чего идёт команда.
Главная практическая сложность — слово «cron» используется для нескольких несовместимых синтаксисов. Стандартный crontab обычно имеет 5 временных полей, а некоторые библиотеки и планировщики добавляют секунды, год и специальные символы. Поэтому expression всегда нужно читать в контексте конкретной реализации.
Классический формат cron expression
* * * * * команда
│ │ │ │ │
│ │ │ │ └─ день недели
│ │ │ └─── месяц
│ │ └───── день месяца
│ └─────── час
└───────── минута

Для пользовательского crontab после пяти полей идёт команда. В системных файлах вроде /etc/crontab или некоторых файлов /etc/cron.d присутствует дополнительное поле пользователя перед командой.
Диапазоны полей
Для распространённой реализации cronie/crontab:
| Поле | Значения |
|---|---|
| минута | 0–59 |
| час | 0–23 |
| день месяца | 1–31 |
| месяц | 1–12 или имена |
| день недели | 0–7, где 0 и 7 — воскресенье, или имена |
POSIX определяет базовый пяти-полевой формат, но детали расширений отличаются между реализациями.
Что означает *
Звёздочка означает все допустимые значения поля.
* * * * * /path/to/job.sh
В классическом cron это соответствует запуску каждую минуту.
Не путайте * с «один раз в любое время»: это именно совпадение со всеми значениями поля.
Пример: каждый час
0 * * * * /path/to/job.sh
Читаем слева направо:
минута = 0
час = любой
день месяца = любой
месяц = любой
день недели = любой
Задача запускается в начале каждого часа.
Пример: каждый день в 03:30
30 3 * * * /path/to/backup.sh
Это 03:30 каждый календарный день по времени, которое использует cron environment.
Диапазоны -
0 9-17 * * * /path/to/job.sh
Диапазон 9-17 включает часы от 9 до 17.
Здесь запуск происходит в нулевую минуту каждого часа диапазона.
Списки ,
0 9,12,18 * * * /path/to/job.sh
Задача запускается в 09:00, 12:00 и 18:00.
Список можно комбинировать с диапазонами, если это поддерживает используемая cron-реализация.
Шаг /
*/5 * * * * /path/to/job.sh
Обычно означает каждые 5 минут внутри диапазона поля минут:
00, 05, 10, 15, ... 55
Важный нюанс: шаг работает внутри конкретного поля, а не как произвольный интервал от момента предыдущего запуска.
Например:
*/23 * * * *
не означает «строго каждые 23 минуты непрерывно». В поле минут совпадения будут вычисляться внутри каждого часа.

День месяца и день недели — важная ловушка
В распространённом Vixie/cronie-style cron, если оба поля ограничены, задача запускается, когда совпадает хотя бы одно из них.
Пример из man page:
30 4 1,15 * 5 /path/to/job.sh
может означать запуск в 04:30:
- 1-го числа;
- 15-го числа;
- а также по пятницам.
Это одна из причин не переносить сложные expressions между планировщиками без проверки их документации.
Имена месяцев и дней недели
Некоторые реализации разрешают сокращённые имена:
0 9 * * mon-fri /path/to/job.sh
Но если portability важна, сверяйтесь с документацией target environment.
5, 6 или 7 полей — почему примеры в интернете отличаются
Классический Unix crontab:
minute hour day-of-month month day-of-week
Некоторые frameworks используют:
second minute hour day-of-month month day-of-week
или добавляют year.
Поэтому expression:
0 0 * * * *
может иметь разный смысл в разных системах.
Перед копированием узнайте:
- сколько полей ожидает scheduler;
- есть ли поле секунд;
- какие special characters поддерживаются;
- как трактуются day-of-month/day-of-week;
- какая timezone используется.
Специальные символы ?, L, W, #
Они встречаются в Quartz-подобных планировщиках и других расширенных форматах, но не являются универсальной частью классического пяти-полевого crontab.
Если вы видите:
0 0 12 ? * MON-FRI
не вставляйте его автоматически в Linux crontab. Сначала проверьте синтаксис конкретного scheduler.
Время и timezone
Cron запускает задачи в соответствии с окружением и настройками системы/daemon. Ошибки timezone особенно заметны после переноса сервера или контейнера.
Проверьте:
date
и при необходимости настройки timezone ОС/контейнера.
Не предполагайте, что cron автоматически использует timezone пользователя веб-приложения.
Переход на летнее/зимнее время
Документация crontab предупреждает: локальное время, которое «пропускается» при переводе часов вперёд, не совпадёт и задача в этот момент не запустится. Повторяющееся время при переводе назад может совпасть дважды.
Для задач, где повторный запуск опасен, проектируйте idempotency независимо от cron.
Как проверить expression перед production
Разделите проверку на две части.
1. Проверить расписание
Запишите словами:
Когда именно должна запускаться задача?
и сопоставьте каждое поле.
2. Проверить саму команду
Запустите её вручную от нужного пользователя и с похожим environment.
Cron может иметь другой PATH, HOME, SHELL и набор environment variables, чем интерактивный terminal.
Связанный материал: что такое Cron и для чего он нужен.
Примеры cron expressions
Каждые 5 минут
*/5 * * * * /path/to/job.sh
Каждый час
0 * * * * /path/to/job.sh
Каждый день в 02:15
15 2 * * * /path/to/job.sh
По будням в 09:00
0 9 * * 1-5 /path/to/job.sh
Первого числа месяца в 04:00
0 4 1 * * /path/to/job.sh
В январе и июле в 00:00 первого числа
0 0 1 1,7 * /path/to/job.sh
Почему */30 и «каждые 30 минут» требуют контекста
*/30 * * * *
совпадает с минутами 0 и 30 каждого часа — это действительно два запуска в час.
Но выражение вида:
*/40 * * * *
не даёт равномерный интервал 40 минут через границы часов. Оно совпадает с допустимыми значениями внутри поля минут.
Если нужен строгий elapsed interval, возможно, cron не лучший инструмент — рассмотрите scheduler/timer, который моделирует интервал явно.
Как связать расписание с heartbeat monitoring
Cron expression отвечает на вопрос когда задача должна стартовать. Он не доказывает, что задача:
- действительно запустилась;
- успешно завершилась;
- уложилась во время;
- не зависла.
Heartbeat monitoring решает соседнюю задачу: ждёт сигнал успешного выполнения в ожидаемом временном окне.

UpWatch можно использовать для контроля Cron/heartbeat-задач: расписание и ожидаемый heartbeat должны соответствовать реальному поведению задачи, включая допустимую длительность.
Типичные ошибки
Копировать expression из другого scheduler
Quartz, cloud schedulers и библиотеки могут иметь другой формат.
Путать поле минут и секунд
В классическом crontab секундного поля нет.
Считать шаг непрерывным интервалом
*/N вычисляется внутри поля.
Не учитывать day-of-month/day-of-week semantics
В распространённом cron оба ограниченных поля могут работать по OR-логике.
Не учитывать timezone
Задача запускается не в том часовом поясе, который ожидал разработчик.
Считать запуск доказательством успеха
Cron может стартовать процесс, который завершится ошибкой через секунду.
Практический чек-лист
- Определить конкретную cron-реализацию.
- Проверить число полей.
- Записать желаемое расписание словами.
- Сопоставить каждое поле expression.
- Проверить
*, ranges, lists и steps. - Отдельно проверить day-of-month/day-of-week.
- Проверить timezone.
- Проверить поведение при DST, если важно.
- Запустить команду вручную в близком environment.
- После запуска контролировать результат через logs/heartbeat.
Источники и документация
Частые вопросы
Сколько полей в cron expression?
В классическом Unix crontab — пять временных полей: минута, час, день месяца, месяц и день недели. Другие планировщики могут добавлять секунды или год.
Что означает звёздочка в cron?
Она означает все допустимые значения конкретного поля. Например, `*` в поле минут совпадает с каждой минутой.
Что означает */5 в cron?
Это шаг 5 внутри диапазона поля. В поле минут обычно получается запуск в 00, 05, 10 и далее до 55 минут каждого часа.
Почему cron expression из Quartz не работает в Linux crontab?
Это разные синтаксисы. Quartz-подобные scheduler могут использовать поле секунд и специальные символы `?`, `L`, `W`, `#`, которых нет в классическом пяти-полевом формате.
Гарантирует ли cron, что задача успешно выполнена?
Нет. Cron определяет расписание запуска. Успех и длительность выполнения нужно контролировать отдельно через exit status, logs или heartbeat monitoring.
Связанные материалы

Что такое Cron и для чего он нужен
Как устроены Cron и crontab в Unix-подобных системах, из каких полей состоит расписание, какие задачи обычно автоматизируют и почему запуск вручную не гарантирует работу по расписанию.

Что такое downtime сайта и чем он опасен
Что считать downtime сайта, какие бывают уровни недоступности, как измерять простой при дискретных проверках и отличать реальный инцидент от единичной ошибки мониторинга.

Как мониторить API endpoint
Как выбрать API endpoint для мониторинга и задать критерии успеха: HTTP-код, timeout, JSON, авторизация, безопасный запрос, частота проверки и диагностика сбоев.