Как читать cron-выражение по полям
Cron-выражение — это короткая строка, которая указывает планировщику, когда запускать задачу. Обычно в ней пять полей, разделённых пробелами: минута, час, день месяца, месяц и день недели. Строка 0 9 * * 1-5 означает 09:00 с понедельника по пятницу. Каждое поле — это число, название, список, диапазон или шаг, либо * для любого значения. Задача запускается в те моменты, когда совпадают все поля.
Пять полей
| Поле | Допустимые значения | Пример |
|---|---|---|
| Минута | от 0 до 59 | 30 — 30-я минута часа |
| Час | от 0 до 23 | 9 — 09:00, 24-часовой формат |
| День месяца | от 1 до 31 | 15 — 15-е число |
| Месяц | от 1 до 12 или от JAN до DEC | 3 или MAR — март |
| День недели | от 0 до 6 или от SUN до SAT | 0 или SUN — воскресенье, 1 — понедельник |
Некоторые системы также принимают 7 как воскресенье, но не все, поэтому используйте 0 или SUN. В этом формате у cron нет поля секунд, поэтому минимальный шаг — одна минута.
Списки, диапазоны, шаги и названия
— любое значение в поле.* * * *запускается каждую минуту.- Список записывается через запятую.
0 9,17 * * *запускается в 09:00 и в 17:00 каждый день. - Диапазон записывается через дефис.
1-5в поле дня недели означает с понедельника по пятницу. - Шаг записывается через косую черту.
*/15в поле минут — это 0, 15, 30 и 45.10-30/5— это 10, 15, 20, 25 и 30. - Названия, такие как
MON-FRI, могут заменять числа. Их проще читать, если планировщик их принимает.
Части можно комбинировать. 0 8-18/2 * * * запускается в 0-ю минуту каждого второго часа с 08:00 до 18:00.
Частые расписания
| Выражение | Значение |
|---|---|
* * * * * | Каждую минуту |
/15 * * * | Каждые 15 минут |
0 * * * * | В 0-ю минуту каждого часа |
0 2 * * * | Каждый день в 02:00 |
0 9 * * 1-5 | 09:00, с понедельника по пятницу |
0 9,17 * * * | 09:00 и 17:00 каждый день |
30 6 1 * * | В 06:30 первого числа каждого месяца |
0 0 * * 0 | Полночь каждое воскресенье |
0 0 1 1 * | Полночь 1 января |
/5 9-17 * 1-5 | Каждые 5 минут с 09:00 до 17:55, с понедельника по пятницу |
Обратите внимание: 0 0 * * — это полночь, а 0 12 * * — полдень. Перепутать час — одна из самых частых ошибок.
День месяца и день недели
Если ограничены и поле дня месяца, и поле дня недели, задача запускается, когда совпадает любое из них. Это классическое правило в Vixie cron и во многих системах, созданных на его основе. Так, 0 0 13 * 5 запускается в полночь 13-го числа каждого месяца и ещё каждую пятницу. Часто ожидают запуска только в пятницу 13-го числа, а получают больше запусков, чем планировалось.
Если одно из двух полей — *, учитывается только другое. Чтобы запускать задачу только в пятницу 13-го, создайте задачу на каждую пятницу и проверяйте дату внутри скрипта. Другие планировщики, в том числе некоторые облачные сервисы, могут действовать по другим правилам, поэтому читайте их документацию.
Часовые пояса и летнее время
Cron работает по часам машины или сервиса, на котором запущен, обычно это местное время её часового пояса. Задача, настроенная на 02:30, запустится в 02:30 по этим часам. Сначала проверьте часовой пояс (в Linux его показывает date). Если нужно, чтобы задачи везде работали по одним часам, многие команды запускают серверы в UTC, а некоторые планировщики позволяют задать часовой пояс для каждой задачи.
Летнее время переводит часы дважды в год. Весной во многих местах время сразу переходит с 02:00 на 03:00, поэтому задача на 02:30 не получает времени на запуск. Осенью час с 01:00 до 01:59 повторяется дважды. Планировщики обрабатывают такие случаи по-разному: одни пропускают задачу, другие запускают её один раз, а третьи — дважды. Если разница важна, не ставьте задачи на ранее утреннее окно перевода часов или используйте UTC.
Шесть полей и Quartz
Некоторые планировщики добавляют поле секунд в начало, поэтому /10 * * * * запускается каждые 10 секунд. Планировщик Quartz для Java использует секунды, минуты, часы, день месяца, месяц, день недели и необязательный год, а также четыре специальных символа:
?означает «конкретное значение не задано». Quartz требует его в поле дня месяца или дня недели — в том, которое вы не задаёте.Lозначает «последний».Lв поле дня месяца — это последний день месяца, а6Lв поле дня недели — последняя пятница.Wозначает ближайший будний день.15W— ближайший будний день к 15-му числу, и он не переходит в другой месяц.#означает n-й день недели.6#3— третья пятница.
Quartz нумерует дни иначе, чем пятизначная форма. Его 1 — воскресенье, а 7 — суббота, поэтому с понедельника по пятницу записывается как 2-6, а не 1-5. Перед тем как копировать строку, всегда проверяйте, какой формат использует ваш планировщик.
Частые ошибки
*/7в поле минут. Значения будут 0, 7, 14 и так далее до 56. Следующим было бы 63, которого не существует, поэтому после 56 запуск идёт в 0-ю минуту следующего часа. Интервал здесь всего четыре минуты, а расстояние между запусками неравномерное. Используйте шаг, который делит 60 без остатка, например 5, 10, 15 или 30.- 30 февраля. Такой даты не существует, поэтому
0 0 30 2 *никогда не запускается. То же относится к 31-му числу в месяце из 30 дней. По правилу «или-или» ограничение по дню недели всё же может вызвать запуск в другие дни, поэтому проверяйте результат. - Час 24 или минута 60. Это значения вне диапазона. Большинство планировщиков отклоняют их при сохранении, но не все.
- Ожидание секунд. Строка из пяти полей запускается только в целые минуты.
- Путаница cron с регулярными выражениями. В cron
означает любое значение. В регулярном выраженииозначает повтор предыдущего элемента. Для шаблонов используйте тестер регулярных выражений, а строки cron держите отдельно.
Проверьте следующие запуски
Прежде чем полагаться на расписание, прочитайте строку простыми словами и выпишите несколько ближайших времён запуска. Расписание cron: разбор делает и то и другое — это самый быстрый способ заметить правило «или-или» или странный шаг.
Короткие ответы
Первое поле — минуты или секунды?
Минуты, в стандартной форме из пяти полей. Секунды добавляют только некоторые планировщики с шестью полями, и ставят их первыми.
Почему моя задача запускается по пятницам и ещё 13-го числа?
Заданы и поле дня месяца, и поле дня недели, поэтому задача запускается, когда совпадает любое из них. Если нужно только одно, поставьте в другом поле *.
Использует ли cron UTC?
Только если машина или сервис настроены на UTC. В остальных случаях используется местный часовой пояс системы.
Переведено с помощью ИИ с Английский оригинал.
Комментарии
Комментариев пока нет. Будьте первым.


