Переводчик Cron выражений - из человеческого языка в Cron
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.sh2. Логируйте вывод для отладки
# Перенаправить вывод в лог-файл
*/5 * * * * /scripts/job.sh >> /var/log/job.log 2>&1
# Лог с временной меткой
*/5 * * * * echo "$(date): Запуск задачи" >> /var/log/job.log; /scripts/job.sh3. Обрабатывайте перекрытия заданий
# Используйте flock для предотвращения одновременных запусков
*/5 * * * * flock -n /var/lock/job.lock /scripts/job.sh
# Или проверьте существующий процесс
*/5 * * * * pgrep -f job.sh || /scripts/job.shЗаключение
Cron выражения предоставляют мощный, стандартизированный способ планирования повторяющихся задач. Ключевые выводы:
- Изучите пятипольную структуру: минута, час, день, месяц, день-недели
- Используйте
*для любого значения,,для списков,-для диапазонов,/для шагов - Учитывайте часовой пояс и различия в синтаксисе систем
- Тестируйте выражения перед production развертыванием
- Документируйте сложные расписания комментариями
- Остерегайтесь граничных случаев как перекрывающиеся условия дня
Используйте Cron Parser для перевода между человеческим языком и cron синтаксисом, валидации выражений и предпросмотра времени следующих запусков.