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

Что такое cron expression

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

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

Cron expression — это компактная запись расписания выполнения задачи. В классическом Unix/Vixie-style crontab первые пять полей задают минуту, час, день месяца, месяц и день недели, после чего идёт команда.

Главная практическая сложность — слово «cron» используется для нескольких несовместимых синтаксисов. Стандартный crontab обычно имеет 5 временных полей, а некоторые библиотеки и планировщики добавляют секунды, год и специальные символы. Поэтому expression всегда нужно читать в контексте конкретной реализации.

Классический формат cron 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 минуты непрерывно». В поле минут совпадения будут вычисляться внутри каждого часа.

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

День месяца и день недели — важная ловушка

В распространённом 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 * * * *

может иметь разный смысл в разных системах.

Перед копированием узнайте:

  1. сколько полей ожидает scheduler;
  2. есть ли поле секунд;
  3. какие special characters поддерживаются;
  4. как трактуются day-of-month/day-of-week;
  5. какая 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 решает соседнюю задачу: ждёт сигнал успешного выполнения в ожидаемом временном окне.

Связь cron expression с ожидаемым временным окном heartbeat: запланированный запуск, выполнение и сигнал успеха

UpWatch можно использовать для контроля Cron/heartbeat-задач: расписание и ожидаемый heartbeat должны соответствовать реальному поведению задачи, включая допустимую длительность.

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

Копировать expression из другого scheduler

Quartz, cloud schedulers и библиотеки могут иметь другой формат.

Путать поле минут и секунд

В классическом crontab секундного поля нет.

Считать шаг непрерывным интервалом

*/N вычисляется внутри поля.

Не учитывать day-of-month/day-of-week semantics

В распространённом cron оба ограниченных поля могут работать по OR-логике.

Не учитывать timezone

Задача запускается не в том часовом поясе, который ожидал разработчик.

Считать запуск доказательством успеха

Cron может стартовать процесс, который завершится ошибкой через секунду.

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

  1. Определить конкретную cron-реализацию.
  2. Проверить число полей.
  3. Записать желаемое расписание словами.
  4. Сопоставить каждое поле expression.
  5. Проверить *, ranges, lists и steps.
  6. Отдельно проверить day-of-month/day-of-week.
  7. Проверить timezone.
  8. Проверить поведение при DST, если важно.
  9. Запустить команду вручную в близком environment.
  10. После запуска контролировать результат через 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.