Cron-выражения: планируй всё без угадываний
Эти криптические строки планирования наконец объяснены. Пиши cron-выражения, которые работают с первого раза.
0 0 * * * — что это значит?
Если ты использовал AWS Lambda, GitHub Actions или любой планировщик задач, ты видел cron-выражения. Пять или шесть криптических полей, которые как-то планируют задачи.
Они не такие сложные, как кажутся.
Пять полей
┌───────────── минута (0 - 59)
│ ┌───────────── час (0 - 23)
│ │ ┌───────────── день месяца (1 - 31)
│ │ │ ┌───────────── месяц (1 - 12)
│ │ │ │ ┌───────────── день недели (0 - 6, воскресенье = 0)
│ │ │ │ │
* * * * *
Каждое поле ограничивает, когда выполняется задача. * означает "каждый". Число означает "только это значение".
Чтение примеров
0 0 * * * — Минута 0, час 0, любой день, любой месяц, любой день недели = Полночь каждый день
30 8 * * 1-5 — 8:30 утра, понедельник-пятница = Будничные утра
0 */2 * * * — Каждые 2 часа = 2 часа ночи, 4 часа ночи, 6 часов утра...
0 9 1 * * — 9 утра 1-го числа каждого месяца = Время ежемесячного отчёта
Специальные символы
* — Каждое значение (каждую минуту, каждый час и т.д.)
, — Несколько значений. 1,15 означает 1-е и 15-е.
- — Диапазон. 1-5 означает от 1 до 5.
/ — Шаг. */15 означает каждые 15. */15 в поле минут = каждые 15 минут.
Частые паттерны
Каждые 5 минут: */5 * * * *
Каждый час в :30: 30 * * * *
Ежедневно в 3 утра: 0 3 * * *
Еженедельно в воскресенье в полночь: 0 0 * * 0
Первое число месяца в 9 утра: 0 9 1 * *
По будням в 6 вечера: 0 18 * * 1-5
Подводные камни
День недели vs день месяца. Если ты устанавливаешь оба, большинство систем объединяют их через ИЛИ. 0 0 1 * 1 запускается 1-го числа И каждый понедельник, а не только в понедельники, которые являются 1-м числом.
Часовой пояс имеет значение. Большинство cron-систем используют серверное время или UTC. Знай, с каким ты имеешь дело.
6 полей vs 5 полей. Некоторые системы добавляют поле секунд в начало. 0 0 0 * * * будет полночью с полем секунд.
Воскресенье = 0 или 7. Зависит от системы. Оба обычно работают для воскресенья.
Тестирование перед развёртыванием
Не угадывай, означает ли 0 0 */2 * * каждые 2 дня или каждые 2 часа. Используй парсер cron.
Прогони несколько ожидаемых времён запуска. Убедись, что они соответствуют твоим намерениям.
Для критических задач настрой мониторинг. Cron-выражение, ошибочное на одно поле, может запускать твою ежедневную задачу каждый час — или твою ежечасную задачу раз в год.
Альтернативы Cron
Английский синтаксис. Некоторые планировщики принимают "каждый день в 3 часа дня" вместо 0 15 * * *. Понятнее, но менее переносимо.
Rate-выражения. AWS использует rate(5 minutes) наряду с cron-выражениями. Проще для простых интервалов.
Systemd таймеры. Linux-альтернатива cron с лучшим логированием и управлением зависимостями.
Cron-выражения плотные, но изучаемые. Пять полей, каждое ограничивает, когда выполняются задачи. Тестируй свои выражения, следи за часовыми поясами, и ты будешь планировать всё надёжно.