Utilo

Примеры выражения Cron: 30 расписаний объяснены (с ловушками)

Узнайте синтаксис cron по полям и скопируйте 30 проверенных выражений cron для каждых N минут, рабочих дней, ежемесячных рабочих мест, рабочих часов и многого другого, плюс ловушки часовых поясов.

· 5 мин чтения

Cron планирует повторяющиеся задания на системах Unix с 1970-х годов, и его синтаксис из пяти полей теперь управляет Kubernetes CronJobs, GitHub Actions, облачными планировщиками, такими как AWS EventBridge и Google Cloud Scheduler, CI-проводами и бесчисленными библиотеками заданий. Синтаксис достаточно компактный, чтобы запомнить, но достаточно тонкий, что большинство инженеров отправили по крайней мере один график, который работал в неправильное время. В этом руководстве объясняется каждая область, а затем перечисляется 30 практических выражений с примечаниями о ловушках.

Пять полей

┌───────────── minute (0–59)
│ ┌─────────── hour (0–23)
│ │ ┌───────── day of month (1–31)
│ │ │ ┌─────── month (1–12 or JAN–DEC)
│ │ │ │ ┌───── day of week (0–6 or SUN–SAT; 7 is also Sunday on most systems)
│ │ │ │ │
* * * * *

Каждое поле принимает:

  • * все значения.
  • Число 5 означает точно 5.
  • Список 1,15 означает 1 и 15.
  • Диапазон 9-17 означает от 9 до 17 включительно.
  • Шаг */15 означает каждое 15-е значение, начиная с минимума; 10-50/20 означает 10, 30, 50.

Задача запускается, когда текущее время совпадает со всеми полями , за исключением одного важного исключения, которое будет рассмотрено ниже. Вставьте любое выражение в [cron expression parser] ((/tools/cron-parser), чтобы увидеть описание на простом языке и следующие сроки выполнения.

Каждые N минут или часов

  1. * * * * * каждую минуту.
  2. */5 * * * * каждые 5 минут (в :00, :05, :10 ...).
  3. */15 * * * * каждые 15 минут.
  4. 0,30 * * * * каждые полчаса, в полтора часа.
  5. 7 * * * * каждые 7 минут. Выбор нечетной минуты устраняет нагрузку от оживленной верхней части часа.
  6. 0 */2 * * * каждые 2 часа, в 00:00, 02:00, 04:00 ...
  7. 0 */6 * * * четыре раза в день: 00:00, 06:00, 12:00, 18:00.
  8. 15 8-18/2 * * * в 08:15, 10:15, 12:15, 14:15, 16:15 и 18:15.

Pitfall: шаги перезапускаются на каждой границе. */7 в минутном поле стреляет в 00:00, 00:07 ... 00:56 и затем снова в 00:00, так что разрыв в течение часа составляет 4 минуты, а не 7. Если вам нужен настоящий фиксированный интервал, который не делится на 60, используйте планировщик, который поддерживает интервалы, или проверьте время работы самостоятельно.

Ежедневные расписания

  1. 0 0 * * * каждый день в полночь.
  2. 30 2 * * * каждый день в 02:30, классическое резервное окно.
  3. 0 9,17 * * * в 09:00 и 17:00 ежедневно.
  4. 0 12 * * * в полдень.
  5. 45 23 * * * в 23:45, незадолго до полуночи для отчетов за конец дня.

Питфолл: Работы между 01:00 и 03:00 по местному времени могут быть пропущены или выполнены дважды при переходе на летнее время. Если ваш сервер использует зону с DST, запланируйте критические задачи за пределами этого окна или запустите сервер в UTC.

В будние дни и выходные

  1. 0 9 * * 1-5 09:00 с понедельника по пятницу.
  2. */10 9-17 * * 1-5 каждые 10 минут в рабочее время в будние дни (последний запуск в 17:50).
  3. 0 10 * * 6,0 10:00 в субботу и воскресенье.
  4. 0 8 * * MON 08:00 каждый понедельник Названия в большинстве реализаций нечувствительны к большим и малым буквам.
  5. 30 16 * * 5 Пятница в 16:30.

Ежемесячно и ежегодно

  1. 0 0 1 * * в полночь первого дня каждого месяца.
  2. 0 6 15 * * 06:00 15-го числа каждого месяца.
  3. 0 0 1,15 * * 1 и 15 числа, обычно для зарплат.
  4. 0 0 1 1 * в полночь 1 января.
  5. 0 9 1 */3 * 09:00 в первый день каждого квартала (январь, апрель, июль, октябрь).
  6. 0 0 L * * последний день месяца. Примечание: L - это расширение, поддерживаемое Quartz, некоторыми облачными планировщиками и несколькими библиотеками, но не классическим Unix cron.
  7. 0 22 28-31 * * в сочетании с проверкой внутри скрипта ([ "$(date -d tomorrow +%d)" = "01" ]) портативный способ запуска в последний день месяца со стандартным cron.

День месяца или день недели?

  1. 0 9 13 * 5 многие читают это как "Пятница 13-го". В классическом хроне это означает "каждый 13-й день месяца и каждую пятницу". Когда оба поля дня ограничены (и *), Vixie cron и его потомки выполняют задание, когда ** либо ** совпадает.

Чтобы запустить только в пятницу 13-го, запланируйте 0 9 13 * * и проверьте день недели в скрипте, или используйте планировщик с явной семантикой AND. Это самое удивительное правило в cron и стоит помнить.

Специальные струны

Многие реализации cron принимают короткие пути:

  1. @hourly то же самое, что и 0 * * * *.
  2. @daily или @midnight 0 0 * * *.
  3. @weekly — 0 0 * * 0.
  4. @reboot один раз при запуске (только в Unix cron; не доступен в Kubernetes или GitHub Actions).

Различия платформы

  • Kubernetes CronJobs использует стандартный синтаксис из пяти полей. С Kubernetes 1.27 вы можете установить spec.timeZone: "Europe/Berlin"; в противном случае расписания следуют зоне менеджера контроллера, которая обычно UTC.
  • Графики GitHub Actions всегда выполняются в UTC, могут быть отложены в периоды высокой загрузки, а минимальный интервал составляет 5 минут. Избегайте 0 * * * *, если важно точность; выберите нечетную минуту.
  • AWS EventBridge использует шесть полей (minute hour day-of-month month day-of-week year) и требует ? в одном из двух полей дня.
  • **Кварц (Java) ** и Спринг используют шесть или семь полей с секундами сначала: 0 0 9 * * MON-FRI.
  • systemd timers используют другой, более читаемый синтаксис (OnCalendar=Mon..Fri 09:00) и обрабатывают пропущенные пробеги с Persistent=true.

Всегда проверяйте, какой диалект ожидает ваша платформа, прежде чем копировать выражение.

Часовые пояса

Cron оценивает выражения в часовом поясе планировщика. Работа, написанная разработчиком в Токио как 0 9 * * *, работает в 09:00 UTC на сервере UTC 18:00 в Токио. Рекомендации:

  • Запускать серверы и планировщики в UTC и конвертировать предполагаемые местные часы в UTC при написании графиков.
  • Если работа должна выполняться в местное рабочее время, используйте планировщик, поддерживающий конкретные часовые пояса.
  • Зарегистрируйте временную отметку каждого запуска в UTC см. [Руководство по Unix-временной отметке] ((/blog/unix-timestamp-explained) для объяснения почему.

Укрепление рабочих мест

Правильное время - это только половина битвы:

  • Предотвратить перекрытия. Если задача может работать дольше, чем ее интервал, используйте блокировку (flock в Unix, concurrencyPolicy: Forbid в Kubernetes).
  • Сделать работу идепотентной. Работа, которая выполняется дважды, например, после повторной попытки или перекрытия DST, не должна взимать двойную плату с клиентов.
  • Вывод захвата. Классические электронные письма cron выводятся локальному пользователю, который обычно никуда не уходит. Перенаправление на журналы и предупреждение о сбоях.
  • ** Используйте абсолютные пути.** Cron работает с минимальной средой и PATH; скрипты, которые работают в вашей оболочке, часто терпят неудачу при cron.
  • Монитор тишины. Сервис, который предупреждает, когда работа не выполняется, обнаруживает нарушенные графики, которые в противном случае бы молча не сработали.

Итоги

Пять полей Cron минута, час, день месяца, месяц, день недели в сочетании с списками, диапазонами и шагами охватывают почти каждый повторяющийся график. Следите за правилом OR, когда установлены оба поля дня, шаги, которые сбросаются на границы, DST около 01:0003:00, и диалекты платформы с дополнительными полями. Проверьте каждое выражение с помощью анализатора, который показывает предстоящие запуска, прежде чем развернуть его.

Эта страница переведена с английского автоматически. Если вы заметили ошибку, сообщите нам.

Похожие руководства