Формат расписания задач

Содержание раздела
  1. Структура выражения
  2. Макросы
  3. Специальные символы
    1. Звездочка *
    2. Вопросительный знак ?
    3. Запятая ,
    4. Дефис -
    5. Слеш /
    6. Символ L
    7. Символ W
    8. Символ #
  4. Сочетание полей
  5. Несуществующие даты
  6. Примеры выражений
  7. Отличия от cron и pg_cron

Расписание задачи планировщика может быть задано в любом из следующем форматов:

* Расписания, поддерживаемые планировщиком 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 или JANDEC * , - /
День недели 6 5 0–7 (где 0 и 7 — воскресенье)
или SUNSAT
* , - / ? 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 см. в разделе О планировщике.