Перейти к содержанию

Синтаксис cron выражений

Cron выражение — это пять полей, которые описывают, когда что-то должно запуститься. Каждое поле говорит, какие значения его единицы допустимы, и работа запускается в каждую минуту, когда согласны все пять полей. Вот вся модель: нет понятия длительности, нет «каждые 90 минут», и нигде не сохраняется состояние следующего запуска.

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

Последний раздел перечисляет синтаксис, который выглядит как cron, но не принимается здесь: расширения Quartz и Jenkins и шестипольная форма с секундами. Стоит их узнавать, потому что скопированное выражение, которое использует одно из них, просто не будет работать.

Пять полей

7

Строка cron состоит из пяти полей, разделённых пробелами, затем команда. Каждое поле должно быть; нет способа опустить одно.

ВыражениеДиапазонЗначение
* * * * *min hod dom mes dowПять полей по порядку: минуты, часы, день месяца, месяц, день неделиПять звёздочек означают каждую минуту каждого дня — самое свободное выражение.
minute0-59Первое поле
hour0-23Второе поле, в 24-часовом формате
day of month1-31Третье полеДень, которого нет в данном месяце, просто пропускается — 31 запускается семь раз в году, не двенадцать.
month1-12Четвёртое поле
day of week0-7Пятое поле, воскресенье первымВоскресенье означают и 0, и 7 — поэтому диапазон идёт до семи, а не до шести.
0 5 13 * 5Когда оба поля дней ограничены, cron запускается при одном или другом — не при обоихЭто запускается 13-го и на каждую пятницу, так что это не "пятница 13". Это единственное правило cron, которое удивляет всех.

Операторы

10

Одни и те же четыре оператора работают в каждом поле; меняется только диапазон чисел, которые они принимают.

ВыражениеДиапазонЗначение
*Каждое значение, которое допускает поле
1,15,30Список отдельных значений
9-17Включающий диапазон
*/15Каждое n-е значение во всём поле*/15 в поле минут означает :00, :15, :30 и :45 — считает от нижней границы диапазона, не от текущего времени.
9-17/2Каждое n-е значение внутри диапазона
5/10Каждое n-е значение от начальной точки до конца поля
0,30 9-17 * * 1-5Операторы свободно комбинируются в любом полеВ каждый полчаса, между девятью и пятью, с понедельника по пятницу.
JAN-DEC1-12Названия месяцев, три буквы, без учёта регистра
SUN-SAT0-6Названия дней, три буквы, без учёта регистра
70Воскресенье, записанное другим способом

Макросы-сокращения

7

Семь имён, которые заменяют всё выражение. Это удобство формата crontab, а не грамматики полей — планировщик, читающий cron строки, может их не принимать.

ВыражениеДиапазонЗначение
@hourly0 * * * *В начало каждого часа
@daily0 0 * * *Один раз в день в полночь
@midnight0 0 * * *То же, что @daily
@weekly0 0 * * 0Один раз в неделю, воскресенье в полночь
@monthly0 0 1 * *Первого числа месяца в полночь
@yearly0 0 1 1 *Первого января в полночь
@annually0 0 1 1 *То же, что @yearly

Примеры

14

Когда выражение перестаёт иметь смысл, читайте его справа налево: самое грубое поле справа, и оно решает, какие дни вообще рассматриваются для более тонких полей.

ВыражениеДиапазонЗначение
* * * * *Каждую минуту
*/5 * * * *Каждые пять минут
0 * * * *Каждый час, в начало часа
0,30 * * * *Каждые полчаса
0 3 * * *Каждый день в 03:00
0 9,17 * * *Дважды в день, в 09:00 и 17:00
*/15 9-17 * * 1-5Каждые пятнадцать минут в рабочие часы в рабочие дни
0 8 * * 1-5В рабочие дни в 08:00
0 10 * * 6,0В субботу и воскресенье в 10:00
30 7 * * MONВ понедельник в 07:30
0 0 1 * *В полночь первого дня каждого месяца
0 0 28-31 * *Каждый день в последней части месяцаСтандартный cron не знает "последний день месяца". Это запустится до четырёх раз; обычное исправление — скрипт, который проверяет дату и сразу выходит.
0 0 1 1,4,7,10 *В полночь первого дня каждого квартала
0 0 1 1 *Один раз в год, в начало 1 января

Расширения, которые этот сайт не принимает

6

Их добавляют Quartz, Jenkins и некоторые облачные планировщики. Они перечислены, чтобы вы их узнали в чужом crontab — парсер здесь отклоняет каждое, как и cron, поставляемый с Linux.

ВыражениеДиапазонЗначение
?"Нет конкретного значения" в том поле дня, которое уже ограничено другим
LПоследний день месяца или последний данный день недели
15WРабочий день ближайший к 15-му
FRI#3Третья пятница месяца
*/30 * * * * *Шестое поле для секунд, в началоШесть полей, не пять. Quartz и несколько библиотек используют эту форму; файл crontab нет.
@rebootЗапустить один раз при старте машиныРеально в crontab, но это не расписание — нет следующего запуска для вычисления, поэтому парсер здесь его отклоняет.

FAQ

Почему моя работа "пятница 13" запускалась каждую пятницу?
Потому что когда оба поля — день месяца и день недели — ограничены, cron рассматривает их как ИЛИ, а не И. 0 5 13 * 5 запускается 13-го и на каждую пятницу. Настоящая пятница 13-го требует проверки даты внутри самого скрипта.
Означает ли */5 "пять минут от сейчас"?
Нет. Шаги считаются от нижней границы диапазона поля, а не от момента установки работы, поэтому */5 в поле минут означает :00, :05, :10 и так далее — независимо от того, когда выражение было написано.
Какой часовой пояс использует cron?
Системный, если в crontab не установлены CRON_TZ или TZ вверху. Это имеет значение дважды в год: работа, запланированная в часу, который пропускает переход на летнее время, не запустится, а работа в часу, который повторяется, может запуститься дважды.
Являются ли 0 и 7 одинаковыми в поле дня недели?
Да, оба означают воскресенье. Дубликат существует, чтобы диапазон 1-7, охватывающий понедельник-воскресенье, можно было написать естественно, что поле 0-6 не может выразить одним диапазоном.
Где я могу протестировать выражение?
Парсер cron на этом сайте принимает выражение и показывает следующие запуски простым языком, локально в вашем браузере. Инструмент рядом с ним идёт другим путём: выберите расписание и он напишет выражение.