Синтаксис cron выражений
Cron выражение — это пять полей, которые описывают, когда что-то должно запуститься. Каждое поле говорит, какие значения его единицы допустимы, и работа запускается в каждую минуту, когда согласны все пять полей. Вот вся модель: нет понятия длительности, нет «каждые 90 минут», и нигде не сохраняется состояние следующего запуска.
Поля читаются слева направо как минуты, часы, день месяца, месяц, день недели. Примеры внизу — это те, за которыми люди действительно ходят, и каждый из них проверяется собственным парсером cron этого сайта перед построением страницы.
Последний раздел перечисляет синтаксис, который выглядит как cron, но не принимается здесь: расширения Quartz и Jenkins и шестипольная форма с секундами. Стоит их узнавать, потому что скопированное выражение, которое использует одно из них, просто не будет работать.
Пять полей
7Строка cron состоит из пяти полей, разделённых пробелами, затем команда. Каждое поле должно быть; нет способа опустить одно.
| Выражение | Диапазон | Значение |
|---|---|---|
| * * * * * | min hod dom mes dow | Пять полей по порядку: минуты, часы, день месяца, месяц, день неделиПять звёздочек означают каждую минуту каждого дня — самое свободное выражение. |
| minute | 0-59 | Первое поле |
| hour | 0-23 | Второе поле, в 24-часовом формате |
| day of month | 1-31 | Третье полеДень, которого нет в данном месяце, просто пропускается — 31 запускается семь раз в году, не двенадцать. |
| month | 1-12 | Четвёртое поле |
| day of week | 0-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-DEC | 1-12 | Названия месяцев, три буквы, без учёта регистра |
| SUN-SAT | 0-6 | Названия дней, три буквы, без учёта регистра |
| 7 | 0 | Воскресенье, записанное другим способом |
Макросы-сокращения
7Семь имён, которые заменяют всё выражение. Это удобство формата crontab, а не грамматики полей — планировщик, читающий cron строки, может их не принимать.
| Выражение | Диапазон | Значение |
|---|---|---|
| @hourly | 0 * * * * | В начало каждого часа |
| @daily | 0 0 * * * | Один раз в день в полночь |
| @midnight | 0 0 * * * | То же, что @daily |
| @weekly | 0 0 * * 0 | Один раз в неделю, воскресенье в полночь |
| @monthly | 0 0 1 * * | Первого числа месяца в полночь |
| @yearly | 0 0 1 1 * | Первого января в полночь |
| @annually | 0 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, но это не расписание — нет следующего запуска для вычисления, поэтому парсер здесь его отклоняет. |