Cron, heartbeat и фоновые задачи

Как читать расписание Cron

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

Опубликовано: 26 августа 2026 г.Обновлено: 26 августа 2026 г.
Схема чтения классического расписания Cron из пяти временных полей

Чтобы прочитать классическое расписание 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

Схема чтения cron expression слева направо по пяти полям времени

В 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 минут

Сравнение шага Cron внутри минутного поля и ошибочного представления о непрерывном интервале

Если нужен именно периодический 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

Связь расписания Cron с ожидаемым запуском, выполнением задачи и heartbeat-сигналом успеха

Если heartbeat не пришёл в ожидаемое окно, это уже отдельный сигнал о сбое или задержке задачи.

Как диагностировать неожиданное расписание

Проверяйте последовательно:

  1. где лежит crontab;
  2. кто его запускает;
  3. какая timezone;
  4. какая реализация cron;
  5. пять ли временных полей;
  6. нет ли дополнительного user field;
  7. DOM/DOW semantics;
  8. DST;
  9. логи фактических запусков.

Не правьте expression, пока не поняли, как текущая система его интерпретирует.

Как связать Cron с мониторингом

Для критичной фоновой задачи полезно знать:

ожидаемый момент
+ допустимая длительность
+ окно задержки
= крайний момент heartbeat

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

Типичные ошибки

  • читать */N как вечный interval timer;
  • перепутать порядок полей;
  • не учитывать timezone;
  • считать DOM и DOW обязательным AND без проверки реализации;
  • переносить выражение из другой системы как классический cron;
  • считать наличие cron entry доказательством успеха задачи;
  • забывать про DST.

Практический чек-лист

  1. Определить реализацию cron.
  2. Проверить количество полей.
  3. Прочитать minute.
  4. Прочитать hour.
  5. Прочитать day of month.
  6. Прочитать month.
  7. Прочитать day of week.
  8. Разобрать *, list, range и step.
  9. Проверить DOM/DOW semantics.
  10. Проверить timezone.
  11. Учесть DST.
  12. Выписать ближайшие ожидаемые запуски.
  13. Сравнить с логами.
  14. Для критичной задачи добавить 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 — поля, диапазоны и примеры