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

Примеры Cron-выражений для популярных расписаний

Практические примеры Cron для запуска каждую минуту, каждые 5–15 минут, каждый час, ежедневно, по будням и ежемесячно с объяснением timezone, шагов и типичных ошибок.

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

Cron expression удобно изучать не как набор символов, а как календарные условия запуска. Для классического пяти-польного формата каждое выражение отвечает на вопрос: в какие минуты, часы, дни месяца, месяцы и дни недели команда должна быть запущена.

Ниже — практические примеры популярных расписаний с разбором и важными ограничениями.

Напоминание: пять полей Cron

минута час день_месяца месяц день_недели

Пример:

30 3 * * 1-5

— в 03:30 по будням в timezone, которую использует конкретная cron-реализация.

Подробнее о синтаксисе: Что такое cron expression и Как читать расписание Cron.

Каждую минуту

* * * * *

Cron проверяет выражения каждую минуту, поэтому такое правило совпадает на каждой минуте каждого часа.

Использовать его для тяжёлой задачи опасно: новый запуск может начаться до завершения предыдущего.

Каждые 5 минут

*/5 * * * *

Типичные моменты:

12:00
12:05
12:10
...
12:55
13:00

Шаг действует внутри минутного поля, а не отсчитывается от фактического завершения предыдущего запуска.

Схема популярных Cron-выражений: каждую минуту, каждые 5 минут, каждый час и ежедневно

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

*/15 * * * *

Соответствует минутам:

00, 15, 30, 45

Каждый час

0 * * * *

Запуск на нулевой минуте каждого часа:

10:00
11:00
12:00

Каждый день в 03:00

0 3 * * *

Важно: «03:00» определяется timezone окружения cron.

Каждый день в 03:30

30 3 * * *

По будням в 09:00

0 9 * * 1-5

В Cronie/Vixie-подобных системах 1-5 обычно соответствует понедельнику–пятнице.

Каждый понедельник в 10:15

15 10 * * 1

В первый день каждого месяца

0 4 1 * *

— 04:00 первого числа месяца.

Ежемесячно в последний день: важное ограничение

В классическом пяти-польном cron нет универсального простого значения «последний день месяца», которое одинаково работает во всех реализациях.

Не переносите Quartz-синтаксис вроде L в системный cron без проверки: это другая диалектная модель.

Для такой задачи часто используют отдельную логику внутри команды или возможности конкретного scheduler.

Каждый январь 1-го числа в 00:00

0 0 1 1 *

Несколько запусков в день

0 9,13,18 * * *

Запуск ежедневно в:

09:00
13:00
18:00

Диапазон часов

0 8-18 * * *

На нулевой минуте каждого часа с 08:00 до 18:00 включительно.

Каждые два часа

0 */2 * * *

Обычно совпадает в:

00:00, 02:00, 04:00, ...

Почему */23 может вас удивить

В поле минут:

*/23 * * * *

получаются:

00, 23, 46

затем новый час снова начинается с 00.

То есть интервалы:

23 мин → 23 мин → 14 мин

Cron — календарный matcher, а не универсальный interval timer.

Комбинация day-of-month и day-of-week

В Cronie/Vixie-подобной семантике, если оба поля ограничены, задача может запускаться, когда совпадает хотя бы одно из них.

Пример:

30 4 1,15 * 5

может означать 04:30:

  • 1-го числа;
  • 15-го числа;
  • каждую пятницу.

Дерево чтения сложного Cron: отдельно проверить minute/hour, day-of-month, month, day-of-week и семантику DOM/DOW

Это одна из причин всегда проверять документацию конкретной реализации.

System crontab и user crontab

Пользовательский crontab:

5 временных полей + команда

Системный файл может содержать:

5 временных полей + user + command

Не принимайте поле пользователя за часть расписания.

Timezone

Одно выражение:

0 9 * * *

может означать разные реальные моменты в UTC и локальной timezone.

Проверьте:

  • timezone хоста;
  • timezone container;
  • CRON_TZ, если реализация поддерживает;
  • настройки orchestrator;
  • DST.

DST: пропущенные и повторные моменты

При переводе часов локальное время может:

  • не существовать;
  • встретиться дважды.

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

Как проверить выражение без гадания

Сделайте три вещи:

  1. сформулируйте cron обычным языком;
  2. выпишите 5–10 ближайших ожидаемых запусков;
  3. сравните их с реальными логами scheduler.

Например:

15 2 * * 1-5

проверочная формулировка:

02:15 по будням

Cron не гарантирует успех задачи

Даже правильное расписание доказывает только ожидаемый момент старта.

cron schedule
→ expected start
→ процесс запущен
→ процесс завершён
→ success heartbeat

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

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

Примеры для типовых фоновых задач

Backup ночью

0 2 * * *

Если backup может выполняться дольше суток или пересекаться с новым запуском, одного расписания недостаточно — нужна защита от overlap.

Импорт каждые 10 минут

*/10 * * * *

Убедитесь, что средняя и максимальная длительность импорта меньше интервала или предусмотрена блокировка параллельного запуска.

Отчёт по понедельникам

0 8 * * 1

Очистка первого числа месяца

30 1 1 * *

Для destructive jobs обязательно проверяйте timezone, права и защиту от случайного повторного выполнения.

Как выбрать расписание для мониторинга heartbeat

Нужно знать:

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

Если cron запускается в 03:00, а задача обычно занимает 10 минут и допустима задержка ещё 5 минут, heartbeat window должен учитывать это, а не ожидаться ровно в 03:00.

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

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

  • переносить Quartz expression в Linux cron;
  • читать */N как бесконечный interval timer;
  • забывать timezone;
  • игнорировать DST;
  • считать DOM и DOW обязательным AND;
  • запускать долгую задачу чаще её длительности;
  • считать наличие cron entry доказательством успешного выполнения;
  • не защищать destructive job от повторного запуска.

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

  1. Определить конкретную cron-реализацию.
  2. Проверить число полей.
  3. Сформулировать расписание словами.
  4. Выписать ближайшие запуски.
  5. Проверить timezone.
  6. Проверить DST.
  7. Проверить DOM/DOW semantics.
  8. Проверить длительность задачи.
  9. Проверить overlap.
  10. Сравнить с реальными логами запусков.
  11. Для критичной задачи добавить heartbeat.
  12. Проверять не только старт, но и успешное завершение.

Источники и документация

Частые вопросы

Как запустить Cron каждые 5 минут?

В классическом пяти-польном cron обычно используют */5 * * * *. Шаг применяется внутри минутного поля.

Как запускать задачу каждый день в 03:00?

Выражение 0 3 * * * при условии, что вы понимаете timezone, в которой cron интерпретирует расписание.

Как настроить запуск по будням?

В Cronie/Vixie-подобном формате обычно используют день недели 1-5, например 0 9 * * 1-5 для 09:00 по будням.

Можно ли записать последний день месяца одинаково для всех Cron?

Нет. Классический пяти-польный cron не имеет универсального переносимого синтаксиса последнего дня месяца; расширения зависят от реализации.

Почему Cron-задача может выполниться дважды при переводе часов?

При DST локальное время может повториться. Поведение зависит от реализации, поэтому критичные расписания нужно проверять отдельно.