Формат расписания задач
Содержание раздела
Расписание задачи планировщика может быть задано в любом из следующем форматов:
- cron-подобное выражение* из 5 или 6 полей, разделенных пробелами;
- макрос.
* Расписания, поддерживаемые планировщиком Prostore, похожи на расписания в cron, но имеют отличия от них.
Структура выражения
Поля выражения перечисляются слева направо в порядке возрастания единицы времени. Позиция каждого поля зависит от количества полей в выражении:
- 5 полей — выражение начинается с минут, а секунды считаются равными 0;
- 6 полей — в начало выражения добавляется поле секунд.
| Поле | Позиция при 6 полях | Позиция при 5 полях | Допустимые значения | Спецсимволы |
|---|---|---|---|---|
| Секунды | 1 | — | 0–59 | * , - / |
| Минуты | 2 | 1 | 0–59 | * , - / |
| Часы | 3 | 2 | 0–23 | * , - / |
| День месяца | 4 | 3 | 1–31 или L | * , - / ? L W |
| Месяц | 5 | 4 | 1–12 или JAN–DEC | * , - / |
| День недели | 6 | 5 | 0–7 (где 0 и 7 — воскресенье) или SUN–SAT | * , - / ? L # |
Например, выражение 30 40 7 11 5 * задает запуск 11 мая в 07:40:30, а выражение 0 9-18 * * 1-5 — запуск в начале каждого часа с 9:00 до 18:00 по рабочим дням.
Макросы
Макросы, которые можно использовать вместо cron-выражений, перечислены в таблице ниже.
| Макрос | Эквивалентное выражение | Периодичность запуска |
|---|---|---|
@hourly | 0 * * * * или 0 0 * * * * | В 00 минут 00 секунд каждого часа |
@daily, @midnight | 0 0 * * * или 0 0 0 * * * | В 00:00:00 каждый день |
@weekly | 0 0 * * 0 или 0 0 0 * * 0 | В 00:00:00 каждое воскресенье |
@monthly | 0 0 1 * * или 0 0 0 1 * * | В 00:00:00 1-го числа каждого месяца |
@yearly, @annually | 0 0 1 1 * или 0 0 0 1 1 * | В 00:00:00 каждого 1 января |
Специальные символы
Звездочка *
Обозначает любое значение поля: задача запускается на каждом шаге интервала, заданного этим полем.
Например, * * * * * задает запуск каждую минуту, а * * * * * * — каждую секунду.
Вопросительный знак ?
Обозначает любое значение поля. Применим только к полям «День месяца» и «День недели».
По смыслу равнозначен * и означает, что в паре полей, задающих день, значение поля с ? не учитывается. Например, 0 0 1 * ? задает запуск 1-го числа каждого месяца независимо от дня недели.
Запятая ,
Задает список значений и диапазонов.
Например, 15,30,45-50 в поле минут задает запуск на 15-й, 30-й, а также с 45-й по 50-ю минуту.
Дефис -
Задает замкнутый диапазон значений, включая границы.
Например, 9-17 в поле часов задает запуск с 9 до 17 часов включительно.
Слеш /
Задает шаг приращения внутри диапазона:
*/<N>— шаг применяется ко всему диапазону поля. Например,*/15в поле минут равнозначно0,15,30,45.<X>/<N>— открытый интервал<X>-MAX/<N>: отсчет начинается со значения<X>и продолжается с шагом<N>до максимально допустимого значения поля. Например,40/3в поле минут задает запуск на 40-й минуте часа и далее каждые 3 минуты (43, 46, 49, 52, 55, 58) до конца часа; в следующем часе цикл повторяется начиная с 40-й минуты.
Символ L
Обозначает «последний» (last). Применим только к полям «День месяца» и «День недели».
В поле «День месяца»:
L— последний день текущего месяца (28, 29, 30 или 31 число);L-<N>— день, вычисляемый как последний день месяца минус<N>. Например,* * L-10 * *задает запуск 21 августа, 20 сентября и так далее;LW— последний рабочий день месяца. Например, если месяц заканчивается в воскресенье, запуск выполняется в предшествующую ему пятницу.
В поле «День недели»:
<день_недели>L— последний такой день недели в месяце. Например,6Lзадает запуск в последнюю субботу месяца, аMONL— в последний понедельник.
Символ W
Обозначает «рабочий день» (weekday) — ближайший к заданному числу день с понедельника по пятницу. Применим только к полю «День месяца».
Задается в виде <число_месяца>W. Например, 15W задает запуск 15-го числа, если это будний день; если 15-е приходится на субботу — запуск выполняется 14-го, если на воскресенье — 16-го.
Символ #
Задает конкретный по счету день недели в месяце. Применим только к полю «День недели».
Задается в виде <день_недели>#<N>, где <N> — порядковый номер этого дня недели в месяце. Например, FRI#2 и 5#2 задают запуск во вторую пятницу месяца.
Сочетание полей
Все поля выражения объединяются по правилу логического «И»: задача запускается только в момент, удовлетворяющий одновременно всем полям. Поля, заданные как * или ?, не учитываются, и условие определяется только оставшимися полями.
Например, 30 40 7 11 5 * задает запуск, когда одновременно наступают 5-й месяц, 11-е число, 7-й час, 40-я минута и 30-я секунда, — то есть 11 мая в 07:40:30. День недели задан как * и в расчет не берется.
Выражение 0 0 1 * 1 задает запуск в 00:00 1-го числа месяца, выпавшего на понедельник.
Несуществующие даты
Если выражение указывает на дату, которой не существует, задача сохраняется, но никогда не выполняется. Пример такой даты — * * 31 6 * (31 июня).
Проверить, что расписание задачи корректно, можно, как описано в разделе Создание задачи.
Примеры выражений
| Выражение | Периодичность запуска |
|---|---|
* * * * * * | Каждую секунду |
*/15 * * * * * | Каждые 15 секунд |
*/10 */5 * * * * | Каждую 10-ю секунду каждой 5-й минуты |
* * * * * | Каждую минуту |
0 9-18 * * 1-5 | В начале каждого часа с 9:00 до 18:00 с понедельника по пятницу |
45 30 22 * * 0 | Каждое воскресенье в 22:30:45 |
0 0 1 1 * | В полночь 1 января каждого года |
Точность соблюдения расписания ограничена интервалом проверки планировщика (по умолчанию — 60 секунд). Подробнее см. в разделе О планировщике задач.
Отличия от cron и pg_cron
Расписания обрабатываются по спецификации Spring CronExpression, которая отличается от расписаний cron и pg_cron. Основные отличия планировщика Prostore от них перечислены в таблице ниже.
Документация pg_cron описывает только некоторые элементы расписания. Поддержку остальных элементов рекомендуется проверять отдельно.
| Элемент расписания | В планировщике Prostore | В классическом cron | В pg_cron |
|---|---|---|---|
| Поля «День месяца» и «День недели»** | Объединяются по правилу логического «И» | Объединяются по правилу логического «ИЛИ» | Нет в документации |
| Поле «Секунды» | Поддерживается в выражении из 6 полей | Не поддерживается, минимальная единица — минута | Задается отдельным выражением <N> seconds (от 1 до 59) без остальных полей |
| Последний день месяца | L, L-<N>, LW | Не поддерживается | $ — только для дня месяца |
Символ ? | Поддерживается | Не поддерживается | Нет в документации |
Символы W, # | Поддерживаются | Не поддерживаются | Нет в документации |
Шаг <X>/<N> | Задает открытый интервал <X>-MAX/<N> | Шаг задается только для диапазона или * | Нет в документации |
Макросы @hourly, @daily и другие | Поддерживаются | Поддерживаются | Нет в документации |
Макрос @reboot | Не поддерживается | Поддерживается | Нет в документации |
** Выражение с днями месяца и недели, перенесенное из cron в планировщик Prostore, будет задавать другие дни запуска: например, 0 0 1 * 1 в Prostore задает запуск 1-го числа, выпавшего на понедельник, а в cron — 1-го числа каждого месяца и каждый понедельник.
Отличия в работе от cron и pg_cron см. в разделе О планировщике.