Cron-выражения: 15 готовых расписаний и ловушки с часовыми поясами
Синтаксис cron умещается в одну строку, но рано или поздно сбивает с толку каждого — обычно в 2 часа ночи в ночь перехода на летнее время. Разберём, как устроены пять полей, приведём расписания, которые можно скопировать, и ловушки, о которых стоит знать.
Пять полей
┌──────── minute (0–59)
│ ┌────── hour (0–23)
│ │ ┌──── day of month (1–31)
│ │ │ ┌── month (1–12)
│ │ │ │ ┌ day of week (0–6, Sunday = 0)
* * * * *
Каждое поле принимает значение (5), список (1,15), диапазон (1-5), шаг (*/10) или * — для любого значения. Некоторые системы (Quartz, AWS EventBridge) добавляют поле секунд или года, поэтому проверьте, для какой версии вы пишете.
Расписания для копирования
| Выражение | Когда запускается |
|---|---|
*/5 * * * * | Каждые 5 минут |
0 * * * * | Каждый час, в начале часа |
15 */2 * * * | На 15-й минуте каждые 2 часа |
0 9 * * * | Каждый день в 09:00 |
30 2 * * * | Каждый день в 02:30 (см. ловушку с летним временем ниже) |
0 9 * * 1-5 | По будням в 09:00 |
0 18 * * 5 | По пятницам в 18:00 |
0 0 * * 0 | По воскресеньям в полночь |
0 0 1 * * | Первый день каждого месяца |
0 0 1 1 * | Раз в год, 1 января |
0 8 1,15 * * | 1-го и 15-го числа в 08:00 |
*/15 9-17 * * 1-5 | Каждые 15 минут в рабочее время |
0 0 * * 6,0 | В полночь по выходным |
0 3 * 1,4,7,10 * | Ежедневно в 03:00 в первый месяц каждого квартала |
0 12 * * * | Ежедневно в полдень |
Составить выражение или перевести любое из них в понятный текст можно с помощью Генератора cron-выражений, который также показывает время следующих запусков.
Ловушка: день месяца против дня недели
Если ограничены и поле дня месяца, и поле дня недели, стандартный cron запускает задачу, когда совпадает любое из них, а не оба сразу. 0 9 13 * 5 запускается 13-го числа каждого месяца и каждую пятницу, а не только в пятницу 13-го. Чтобы запускать задачу в последний рабочий день или в первый понедельник, настройте ежедневный запуск и проверяйте дату в скрипте либо используйте планировщик с расширениями вроде L и #.
Часовые пояса и летнее время
- Серверы и CI работают в UTC. Расписания GitHub Actions, большинство контейнеров и облачных планировщиков используют UTC. 09:00 по нью-йоркскому времени — это
0 14 * * *зимой и0 13 * * *летом. Пересчитать время можно с помощью Конвертера часовых поясов, а сразу несколько поясов посмотреть на Мировых часах. - Задачи между 01:00 и 03:00 по местному времени рискованны. При переходе на летнее время 02:30 не существует, и задача может быть пропущена; при переходе на зимнее она может запуститься дважды. Критичные задачи planируйте вне этого окна или запускайте планировщик в UTC.
- GitHub Actions может запускать задачи с опозданием на несколько минут в часы пик, а в репозиториях без активности в течение 60 дней расписание отключается. Создать workflow можно с помощью Генератора GitHub Actions.