DevToys Pro

бесплатные веб-инструменты для разработчиков

Блог
Оцените нас:
Попробуйте расширение для браузера:
← Назад к блогу

Переводчик Cron выражений - из человеческого языка в Cron

12 мин чтения

Cron выражения — стандартный способ планирования повторяющихся задач в Unix-подобных системах, CI/CD конвейерах, облачных сервисах и планировщиках приложений. Однако синтаксис может быть загадочным: что означает */5 * * * *? И как выразить "каждый будний день в 9 утра"?

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

Структура Cron выражения

Стандартное cron выражение имеет пять или шесть полей (в зависимости от системы):

┌─────── минута (0 - 59)
│ ┌───── час (0 - 23)
│ │ ┌─── день месяца (1 - 31)
│ │ │ ┌─ месяц (1 - 12)
│ │ │ │ ┌ день недели (0 - 6) (Воскресенье = 0 или 7)
│ │ │ │ │
* * * * *

Некоторые системы (как Quartz Scheduler) добавляют поле секунд в начало:

┌────── секунда (0 - 59)
│ ┌──── минута (0 - 59)
│ │ ┌── час (0 - 23)
│ │ │ ┌ день месяца (1 - 31)
│ │ │ │ ┌ месяц (1 - 12)
│ │ │ │ │ ┌ день недели (0 - 6)
│ │ │ │ │ │
* * * * * *

Распространенные паттерны: от человеческого к Cron

Каждые N минут

ЧеловеческийCron
Каждую минуту* * * * *
Каждые 5 минут*/5 * * * *
Каждые 15 минут*/15 * * * *
Каждые 30 минут*/30 * * * *

Каждые N часов

ЧеловеческийCron
Каждый час0 * * * *
Каждые 2 часа0 */2 * * *
Каждые 6 часов0 */6 * * *
Каждые 12 часов0 */12 * * *

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

ЧеловеческийCron
Каждый день в полночь0 0 * * *
Каждый день в 9 утра0 9 * * *
Каждый день в 5:30 вечера30 17 * * *
Дважды в день (9 утра и 5 вечера)0 9,17 * * *

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

ЧеловеческийCron
Каждый понедельник в 9 утра0 9 * * 1
Каждую пятницу в 5 вечера0 17 * * 5
Каждый будний день в 8 утра0 8 * * 1-5
Каждые выходные в 10 утра0 10 * * 0,6

Ежемесячные расписания

ЧеловеческийCron
Первый день месяца в полночь0 0 1 * *
15-е число каждого месяца в 2 дня0 14 15 * *

Элементы Cron синтаксиса

Звездочка (*) - Любое значение

* * * * *

Каждую минуту

* 9 * * *

Каждую минуту с 9:00 до 9:59

Запятая (,) - Список значений

0 9,12,17 * * *

В 9 утра, 12 дня и 5 вечера

0 0 * * 1,3,5

Каждый понедельник, среду и пятницу в полночь

Дефис (-) - Диапазон

0 9-17 * * *

Каждый час с 9 утра до 5 вечера

0 0 * * 1-5

Каждый будний день (понедельник-пятница) в полночь

Слеш (/) - Шаговые значения

*/5 * * * *

Каждые 5 минут

0 */2 * * *

Каждые 2 часа (на минуте 0)

0 9-17/2 * * *

Каждые 2 часа с 9 утра до 5 вечера (9, 11, 13, 15, 17)

Реальные примеры

Пример 1: Система резервного копирования

# Инкрементальные бэкапы каждые 4 часа
0 */4 * * *

# Полный бэкап каждое воскресенье в 2 утра
0 2 * * 0

# Бэкап базы данных каждый день в 1 ночи
0 1 * * *

Пример 2: CI/CD конвейер

# Запуск тестов каждые 15 минут в рабочие часы (9-17, будни)
*/15 9-17 * * 1-5

# Деплой на staging каждый будний день в 6 вечера
0 18 * * 1-5

# Очистка старых сборок каждый день в 3 ночи
0 3 * * *

Пример 3: Мониторинг и уведомления

# Проверка здоровья каждую минуту
* * * * *

# Почасовые отчеты
0 * * * *

# Ежедневная сводка в 8 утра
0 8 * * *

# Еженедельный отчет каждый понедельник в 9 утра
0 9 * * 1

Распространенные ошибки и граничные случаи

Ошибка 1: Оба поля дня активны

Когда указаны оба день-месяца и день-недели (не *), задание запускается когда любое условие совпадает:

# Это запускается 15-го числа каждого месяца И каждую пятницу
0 0 15 * 5

# Не только в пятницу 15-го!

Ошибка 2: Шаговые значения не гарантируют выравнивание

# Это запускается в :00, :05, :10, :15, :20, :25, :30, :35, :40, :45, :50, :55
*/5 * * * *

# НЕ произвольно "каждые 5 минут с момента запуска"

Cron всегда выравнивается по границам часов. */5 означает "когда минута по модулю 5 равна 0."

Ошибка 3: Путаница с часовыми поясами

Cron работает в локальном часовом поясе системы (или контейнера). При развертывании в разных регионах:

  • Проверяйте часовой пояс с помощью date или timedatectl
  • Используйте UTC для консистентности между серверами
  • Документируйте часовой пояс в комментариях cron

Тестирование Cron выражений

Перед развертыванием cron заданий в production, валидируйте их используя DevToys Pro Cron Parser:

  • Переводите между cron синтаксисом и человеко-читаемыми описаниями
  • Предпросматривайте следующие запуски для проверки соответствия расписания вашим намерениям
  • Валидируйте синтаксис перед добавлением в crontab
  • Тестируйте граничные случаи такие как границы месяцев и високосные годы

Практические советы

1. Используйте комментарии в Crontab

# Бэкап базы данных каждую ночь в 2 утра
0 2 * * * /scripts/backup.sh

# Очистка временных файлов каждое воскресенье в 3 утра
0 3 * * 0 /scripts/cleanup.sh

# Отправка еженедельного отчета каждый понедельник в 9 утра
0 9 * * 1 /scripts/report.sh

2. Логируйте вывод для отладки

# Перенаправить вывод в лог-файл
*/5 * * * * /scripts/job.sh >> /var/log/job.log 2>&1

# Лог с временной меткой
*/5 * * * * echo "$(date): Запуск задачи" >> /var/log/job.log; /scripts/job.sh

3. Обрабатывайте перекрытия заданий

# Используйте flock для предотвращения одновременных запусков
*/5 * * * * flock -n /var/lock/job.lock /scripts/job.sh

# Или проверьте существующий процесс
*/5 * * * * pgrep -f job.sh || /scripts/job.sh

Заключение

Cron выражения предоставляют мощный, стандартизированный способ планирования повторяющихся задач. Ключевые выводы:

  • Изучите пятипольную структуру: минута, час, день, месяц, день-недели
  • Используйте * для любого значения, , для списков, - для диапазонов, / для шагов
  • Учитывайте часовой пояс и различия в синтаксисе систем
  • Тестируйте выражения перед production развертыванием
  • Документируйте сложные расписания комментариями
  • Остерегайтесь граничных случаев как перекрывающиеся условия дня

Используйте Cron Parser для перевода между человеческим языком и cron синтаксисом, валидации выражений и предпросмотра времени следующих запусков.