Как читать расписание Cron
Практическое руководство по чтению классического Cron: пять полей, *, списки, диапазоны и шаги, особенности day-of-month/day-of-week, timezone и переходы летнего времени.

Чтобы прочитать классическое расписание Cron, нужно разбирать выражение слева направо по пяти временным полям, а затем учитывать особенности конкретной реализации cron и timezone.
Пример:
30 3 * * 1-5
означает: запуск в 03:30 по дням недели с понедельника по пятницу в той timezone, в которой cron интерпретирует расписание.
Пять полей классического cron expression
┌──────── минута 0–59
│ ┌────── час 0–23
│ │ ┌──── день месяца 1–31
│ │ │ ┌── месяц 1–12
│ │ │ │ ┌ день недели 0–7
│ │ │ │ │
30 3 * * 1-5

В Cronie/Vixie-подобном формате 0 и 7 могут обозначать воскресенье. В других планировщиках синтаксис может отличаться, поэтому не переносите выражение между системами без проверки документации.
Что означает звёздочка
* означает все допустимые значения поля.
* * * * *
В классическом cron это проверка на совпадение каждую минуту.
0 * * * *
— на нулевой минуте каждого часа.
0 0 * * *
— в 00:00 каждый день.
Список значений
Запятая задаёт несколько значений:
0 9,13,18 * * *
Запуск в:
09:00
13:00
18:00
каждый день.
Диапазон
Дефис задаёт включительный диапазон:
0 9 * * 1-5
— в 09:00 с понедельника по пятницу.
0 8-18 * * *
— каждый час с 08:00 до 18:00 на нулевой минуте.
Шаг
Слэш задаёт шаг внутри выбранного диапазона или поля:
*/15 * * * *
Минутное поле принимает:
00, 15, 30, 45
каждого часа.
Важно: это не универсальный таймер «через 15 минут после предыдущего запуска». Cron сопоставляет календарные поля.
Почему */23 не означает «каждые 23 минуты навсегда»
*/23 * * * *
в минутном поле даёт значения:
00, 23, 46
Затем начинается новый час и поле снова начинается с 00.
Интервалы получаются:
00 → 23 = 23 минуты
23 → 46 = 23 минуты
46 → 00 следующего часа = 14 минут

Если нужен именно периодический interval timer, а не календарное расписание, cron может быть неподходящим инструментом.
Как читать выражение пошагово
Возьмём:
15 2 * * 1-5
Поле 1: minute
15 → на 15-й минуте.
Поле 2: hour
2 → в 02 часа.
Поле 3: day of month
* → любой день месяца.
Поле 4: month
* → любой месяц.
Поле 5: day of week
1-5 → рабочие дни при принятой нумерации реализации.
Результат:
02:15 по будням
Пример: каждые 5 минут
*/5 * * * *
Типичные моменты:
12:00
12:05
12:10
...
12:55
13:00
Пример: каждый день в 03:30
30 3 * * *
Пример: первого числа месяца
0 4 1 * *
— 04:00 первого числа каждого месяца.
Пример: по понедельникам
0 9 * * 1
— 09:00 по понедельникам.
Важная особенность day-of-month и day-of-week
В Cronie/Vixie-подобной семантике, если оба поля day of month и day of week ограничены, задача запускается, когда совпадает хотя бы одно из них.
Например:
30 4 1,15 * 5
может означать запуск в 04:30:
- 1-го числа;
- 15-го числа;
- каждую пятницу.
Это одна из самых опасных ошибок при ручном чтении cron.
Не предполагайте, что все планировщики реализуют это одинаково: проверяйте документацию конкретной системы.
Месяцы и названия дней
Некоторые реализации позволяют:
0 9 * * mon-fri
или:
0 0 1 jan *
Но числовая и текстовая поддержка зависит от реализации. Если расписание переносится между окружениями, проверяйте его именно там, где оно будет исполняться.
Cron и timezone
Выражение само по себе не содержит универсальной timezone.
Нужно выяснить:
- timezone системного cron;
CRON_TZ, если поддерживается;- timezone container;
- timezone orchestrator;
- UTC или локальное время приложения.
Одно и то же:
0 9 * * *
может означать разные реальные моменты в разных окружениях.
Переходы летнего времени
В системах с локальной timezone переход DST может создавать:
- время, которого не существует;
- время, которое встречается дважды.
Документация Cronie предупреждает: задача в пропущенный локальный момент может не запуститься, а в повторившийся — запуститься дважды.
Для критичных задач это нужно учитывать отдельно.
Системный crontab и пользовательский crontab
В пользовательском crontab обычно:
5 временных полей + команда
В системном файле может присутствовать дополнительное поле пользователя:
5 временных полей + user + command
Не перепутайте шестое поле system crontab с частью времени.
Как проверить, что вы прочитали расписание правильно
Сформулируйте его обычным языком:
30 3 * * 1-5
→ в 03:30 по будням
Затем выпишите несколько ближайших ожидаемых запусков и сравните с реальными логами.
Cron expression не доказывает выполнение задачи
Даже идеально прочитанное расписание отвечает только на вопрос когда cron должен попытаться запустить команду.
Оно не доказывает:
- что процесс стартовал;
- что завершился;
- что не завис;
- что создал backup;
- что импорт обработал данные.
ожидаемый запуск
→ cron старт
→ выполнение
→ success heartbeat

Если heartbeat не пришёл в ожидаемое окно, это уже отдельный сигнал о сбое или задержке задачи.
Как диагностировать неожиданное расписание
Проверяйте последовательно:
- где лежит crontab;
- кто его запускает;
- какая timezone;
- какая реализация cron;
- пять ли временных полей;
- нет ли дополнительного user field;
- DOM/DOW semantics;
- DST;
- логи фактических запусков.
Не правьте expression, пока не поняли, как текущая система его интерпретирует.
Как связать Cron с мониторингом
Для критичной фоновой задачи полезно знать:
ожидаемый момент
+ допустимая длительность
+ окно задержки
= крайний момент heartbeat
UpWatch можно использовать для heartbeat-контроля Cron и фоновых задач: если ожидаемый сигнал не пришёл в заданное окно, это позволяет обнаружить пропущенный или зависший запуск.
Типичные ошибки
- читать
*/Nкак вечный interval timer; - перепутать порядок полей;
- не учитывать timezone;
- считать DOM и DOW обязательным AND без проверки реализации;
- переносить выражение из другой системы как классический cron;
- считать наличие cron entry доказательством успеха задачи;
- забывать про DST.
Практический чек-лист
- Определить реализацию cron.
- Проверить количество полей.
- Прочитать minute.
- Прочитать hour.
- Прочитать day of month.
- Прочитать month.
- Прочитать day of week.
- Разобрать
*, list, range и step. - Проверить DOM/DOW semantics.
- Проверить timezone.
- Учесть DST.
- Выписать ближайшие ожидаемые запуски.
- Сравнить с логами.
- Для критичной задачи добавить heartbeat.
Источники и документация
Частые вопросы
Сколько полей в классическом cron expression?
Пять временных полей: минута, час, день месяца, месяц и день недели. После них в пользовательском crontab идёт команда.
Что означает * в Cron?
Звёздочка означает все допустимые значения соответствующего поля.
Что означает */15 в поле минут?
Шаг 15 внутри минутного поля: обычно минуты 00, 15, 30 и 45 каждого часа. Это не таймер, отсчитывающий 15 минут от фактического завершения предыдущего запуска.
Почему day-of-month и day-of-week опасно читать как AND?
В Cronie/Vixie-подобной семантике при ограничении обоих полей запуск происходит, когда совпадает хотя бы одно. В других системах правила могут отличаться.
Может ли timezone изменить фактическое время запуска?
Да. Cron интерпретирует поля в timezone окружения или специальной настройке реализации. Одно выражение в UTC и локальной timezone соответствует разным моментам.
Связанные материалы

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

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