fixmint
RU

Как читать cron-выражение по полям

Автор: · · Чтение: 5 мин

Cron-выражение — это короткая строка, которая указывает планировщику, когда запускать задачу. Обычно в ней пять полей, разделённых пробелами: минута, час, день месяца, месяц и день недели. Строка 0 9 * * 1-5 означает 09:00 с понедельника по пятницу. Каждое поле — это число, название, список, диапазон или шаг, либо * для любого значения. Задача запускается в те моменты, когда совпадают все поля.

Расписание cron: разборCron запускается не в то времяСделать бесплатно

Пять полей

ПолеДопустимые значенияПример
Минутаот 0 до 5930 — 30-я минута часа
Часот 0 до 239 — 09:00, 24-часовой формат
День месяцаот 1 до 3115 — 15-е число
Месяцот 1 до 12 или от JAN до DEC3 или MAR — март
День неделиот 0 до 6 или от SUN до SAT0 или 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-509: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. В остальных случаях используется местный часовой пояс системы.

Переведено с помощью ИИ с Английский оригинал.

Комментарии

    Комментариев пока нет. Будьте первым.

    Ваша оценка (необязательно)

    Ваша почта никогда не показывается и не сохраняется.

    Обложка книги «Agentic AI in the Browser»Agentic AI in the Browser

    Примеры использования приватных браузерных ИИ-сценариев: та же идея, что лежит в основе fixmint, — всё делается на вашем устройстве.

    $4.99Купить на GumroadНа английском