Примеры выражения 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 минут или часов
* * * * *каждую минуту.*/5 * * * *каждые 5 минут (в :00, :05, :10 ...).*/15 * * * *каждые 15 минут.0,30 * * * *каждые полчаса, в полтора часа.7 * * * *каждые 7 минут. Выбор нечетной минуты устраняет нагрузку от оживленной верхней части часа.0 */2 * * *каждые 2 часа, в 00:00, 02:00, 04:00 ...0 */6 * * *четыре раза в день: 00:00, 06:00, 12:00, 18:00.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, используйте планировщик, который поддерживает интервалы, или проверьте время работы самостоятельно.
Ежедневные расписания
0 0 * * *каждый день в полночь.30 2 * * *каждый день в 02:30, классическое резервное окно.0 9,17 * * *в 09:00 и 17:00 ежедневно.0 12 * * *в полдень.45 23 * * *в 23:45, незадолго до полуночи для отчетов за конец дня.
Питфолл: Работы между 01:00 и 03:00 по местному времени могут быть пропущены или выполнены дважды при переходе на летнее время. Если ваш сервер использует зону с DST, запланируйте критические задачи за пределами этого окна или запустите сервер в UTC.
В будние дни и выходные
0 9 * * 1-509:00 с понедельника по пятницу.*/10 9-17 * * 1-5каждые 10 минут в рабочее время в будние дни (последний запуск в 17:50).0 10 * * 6,010:00 в субботу и воскресенье.0 8 * * MON08:00 каждый понедельник Названия в большинстве реализаций нечувствительны к большим и малым буквам.30 16 * * 5Пятница в 16:30.
Ежемесячно и ежегодно
0 0 1 * *в полночь первого дня каждого месяца.0 6 15 * *06:00 15-го числа каждого месяца.0 0 1,15 * *1 и 15 числа, обычно для зарплат.0 0 1 1 *в полночь 1 января.0 9 1 */3 *09:00 в первый день каждого квартала (январь, апрель, июль, октябрь).0 0 L * *последний день месяца. Примечание:L- это расширение, поддерживаемое Quartz, некоторыми облачными планировщиками и несколькими библиотеками, но не классическим Unix cron.0 22 28-31 * *в сочетании с проверкой внутри скрипта ([ "$(date -d tomorrow +%d)" = "01" ]) портативный способ запуска в последний день месяца со стандартным cron.
День месяца или день недели?
0 9 13 * 5многие читают это как "Пятница 13-го". В классическом хроне это означает "каждый 13-й день месяца и каждую пятницу". Когда оба поля дня ограничены (и*), Vixie cron и его потомки выполняют задание, когда ** либо ** совпадает.
Чтобы запустить только в пятницу 13-го, запланируйте 0 9 13 * * и проверьте день недели в скрипте, или используйте планировщик с явной семантикой AND. Это самое удивительное правило в cron и стоит помнить.
Специальные струны
Многие реализации cron принимают короткие пути:
@hourlyто же самое, что и0 * * * *.@dailyили@midnight0 0 * * *.@weekly—0 0 * * 0.@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, и диалекты платформы с дополнительными полями. Проверьте каждое выражение с помощью анализатора, который показывает предстоящие запуска, прежде чем развернуть его.
Эта страница переведена с английского автоматически. Если вы заметили ошибку, сообщите нам.