Перейти к содержимому
LeedyBox
Поддержать

Как читать выражения cron

Выражение cron описывает повторяющееся расписание несколькими полями, разделёнными пробелами. Идея проста, но порядок полей и специальные символы в разных системах различаются. В этом руководстве показано, как читать распространённые форматы.

Пять полей Unix

Классический cron в Unix и Linux использует пять полей, которые читаются слева направо:

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

Так, 30 9 * * 1-5 означает «в 09:30 с понедельника по пятницу». Минуты принимают значения от 0 до 59, часы — от 0 до 23, дни месяца — от 1 до 31, месяцы — от 1 до 12. День недели — от 0 до 6, где 0 означает воскресенье (многие реализации также принимают 7 как воскресенье). Большинство версий также принимают названия вроде JAN или MON и макросы вроде @daily или @hourly.

Форматы Spring, Quartz и AWS

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

Формат Поля День недели
Unix / Linux 5: минута час день месяц день-недели 0–6, воскресенье = 0
Spring 6: секунда минута час день месяц день-недели 0–7, воскресенье = 0 или 7
Quartz 6 или 7: секунда минута час день месяц день-недели [год] 1–7, воскресенье = 1
AWS EventBridge 6: минута час день месяц день-недели год 1–7, воскресенье = 1

Одни и те же цифры могут означать разное: 0 0 12 * * ? в Quartz — это «каждый день в полдень», а при чтении в 5-польном формате такое выражение было бы недопустимым. Номера дней недели тоже сдвигаются: в Quartz и AWS 2 — это понедельник, а в cron Unix — вторник. Названия дней вроде MON там, где они поддерживаются, устраняют эту неоднозначность.

Специальные символы

  • * — любое значение поля.
  • , — список, например 1,15.
  • - — диапазон, например 9-17 или MON-FRI.
  • / — шаг: */15 в поле минут означает каждые 15 минут; 5/15 начинается с 5 (не поддерживается классическим cron Unix, где используют диапазон вроде 5-59/15).
  • ? — «без конкретного значения»; Quartz и AWS требуют его либо в поле дня месяца, либо в поле дня недели.
  • L — последний: L в поле дня месяца означает последний день месяца; в Quartz 6L в поле дня недели — последняя пятница.
  • W — ближайший рабочий день: 15W — рабочий день, ближайший к 15-му числу.
  • # — n-й день недели в месяце: 6#3 — третья пятница при нумерации Quartz и AWS.

L, W и # — расширения, которые классический cron Unix не поддерживает.

День месяца и день недели

Когда ограничены оба поля дней, системы по-разному решают, как их сочетать. В классическом cron Unix задание запускается, когда совпадает любое из полей: 0 9 13 * 5 выполняется 13-го числа каждого месяца и каждую пятницу, а не только в пятницу 13-е. Spring требует совпадения обоих полей. Quartz и AWS обходят этот вопрос, требуя ? в одном из двух полей.

Разбор cron от LeedyBox применяет правило выбранного формата и поясняет в сводке, должно ли совпасть одно из полей дня или оба.

Часовые пояса и летнее время

Выражение cron не содержит часового пояса. Оно выполняется в часовом поясе системы или сервиса, которые его запускают, — это может быть местное время сервера или UTC. Задание, написанное на 09:00 по местному времени, может запуститься в другой час, если сервер использует UTC.

Переход на летнее время добавляет новые пограничные случаи. Когда часы переводят вперёд, времени вроде 02:30 в этот день может не быть; когда назад — оно может наступить дважды. В зависимости от реализации задание в этом интервале может быть пропущено, выполнено с опозданием или выполнено дважды. Чтобы избежать неожиданностей, планируйте важные задания вне интервала перехода или в UTC. Разбор cron позволяет выбрать часовой пояс и показывает ближайшие запуски, чтобы вы могли проверить даты около перехода.

Часто задаваемые вопросы

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

В cron Unix используйте */5 * * * *. В Spring добавьте в начало поле секунд: 0 */5 * * * *.

Почему моё выражение Quartz не работает в crontab Linux?

Выражения Quartz начинаются с поля секунд и могут использовать ? или L, которые crontab не принимает. Перепишите выражение в 5-польном формате.

Точны ли ближайшие запуски, которые показывает разбор?

Они вычисляются в вашем браузере для выбранного формата и часового пояса. Проверьте расписание в системе, которая будет выполнять задание, поскольку реализации могут различаться.