Шпаргалка по Cron-выражениям — Планируйте задачи как профессионал
Cron — это основа автоматизации запланированных задач в Unix-подобных системах. Будь то ротация логов, выполнение резервных копий баз данных или запуск CI/CD-пайплайнов, cron-выражения определяют когда эти задачи выполняются. Синтаксис компактный, но мощный — и легко ошибиться, если угадываете.
Этот справочник охватывает каждую часть синтаксиса cron с практическими примерами, готовыми для копирования. Если вы хотите интерактивно создавать и проверять выражения, откройте Конструктор Cron-выражений рядом с этим руководством.
Синтаксис Cron: Пять полей
Стандартное cron-выражение состоит из пяти полей, разделённых пробелами:
┌───────────── минута (0–59)
│ ┌───────────── час (0–23)
│ │ ┌───────────── день месяца (1–31)
│ │ │ ┌───────────── месяц (1–12)
│ │ │ │ ┌───────────── день недели (0–7, где 0 и 7 = Воскресенье)
│ │ │ │ │
* * * * *
Каждое поле принимает конкретное значение, диапазон, список или подстановочный символ. Вместе пять полей определяют точное повторяющееся расписание.
| Поле | Допустимые значения | Специальные символы |
|---|---|---|
| Минута | 0–59 | * , - / |
| Час | 0–23 | * , - / |
| День месяца | 1–31 | * , - / |
| Месяц | 1–12 | * , - / |
| День недели | 0–7 | * , - / |
Поля месяца и дня недели также принимают трёхбуквенные сокращения (JAN–DEC, SUN–SAT) в большинстве реализаций.
Специальные символы
Понимание четырёх специальных символов раскрывает всю мощь cron:
Звёздочка * — «Каждый»
Соответствует каждому возможному значению для данного поля.
* * * * * # Каждую минуту каждого часа каждого дня
Запятая , — «И»
Указывает список дискретных значений.
0 9,12,18 * * * # В 9:00, 12:00 и 18:00 ежедневно
Дефис - — «До»
Определяет включающий диапазон.
0 9-17 * * * # Каждый час с 9 до 17
Косая черта / — «Каждый n-й»
Устанавливает интервал шага от начала диапазона.
*/10 * * * * # Каждые 10 минут (0, 10, 20, 30, 40, 50)
Можно комбинировать диапазон с шагом:
0 9-17/2 * * * # Каждые 2 часа с 9 до 17 (9, 11, 13, 15, 17)
Типичные примеры расписаний Cron
Сохраните эту таблицу в закладках. Это расписания, которые вы будете использовать снова и снова.
| Расписание | Выражение | Пояснение |
|---|---|---|
| Каждую минуту | * * * * * | Выполняется в начале каждой минуты |
| Каждые 5 минут | */5 * * * * | Минуты 0, 5, 10, 15, …, 55 |
| Каждые 15 минут | */15 * * * * | Минуты 0, 15, 30, 45 |
| Каждый час | 0 * * * * | В 0-ю минуту каждого часа |
| Каждые 6 часов | 0 */6 * * * | В 00:00, 06:00, 12:00, 18:00 |
| Ежедневно в полночь | 0 0 * * * | Раз в день в 00:00 |
| Ежедневно в 3 часа ночи | 0 3 * * * | Раз в день в 03:00 |
| Каждый понедельник в 9 утра | 0 9 * * 1 | Еженедельно в понедельник в 09:00 |
| Каждый будний день в 8 утра | 0 8 * * 1-5 | С понедельника по пятницу в 08:00 |
| Каждые выходные в полдень | 0 12 * * 0,6 | Суббота и воскресенье в 12:00 |
| Первое число каждого месяца | 0 0 1 * * | Полночь 1-го числа каждого месяца |
| Каждый квартал (Янв, Апр, Июл, Окт) | 0 0 1 1,4,7,10 * | Полночь 1-го числа квартальных месяцев |
| Каждые 15 мин в рабочее время | */15 9-17 * * 1-5 | Будни, 9–17, каждые 15 минут |
Вставьте любое выражение в Конструктор Cron-выражений для визуализации следующих времён выполнения.
Продвинутые паттерны
Комбинирование списков и диапазонов
Поля принимают смешанный синтаксис. Для запуска задачи в 8 утра и 6 вечера по будням:
0 8,18 * * 1-5
Для указания конкретных месяцев с шагом:
0 0 1 1-12/3 * # Каждые 3 месяца начиная с января (Янв, Апр, Июл, Окт)
День месяца vs. День недели
Когда оба поля — день месяца и день недели — установлены (не *), поведение зависит от реализации. В стандартном cron задача выполняется, если выполнено любое из условий — это отношение ИЛИ, а не И. Это застаёт многих врасплох.
0 0 15 * 1 # Выполняется 15-го числа И каждый понедельник — не «понедельник 15-го»
Запуск при загрузке
Хотя это не cron-выражение в строгом смысле, @reboot — широко поддерживаемое сокращение:
@reboot /usr/local/bin/start-service.sh
Другие распространённые сокращения:
| Сокращение | Эквивалент |
|---|---|
@yearly | 0 0 1 1 * |
@monthly | 0 0 1 * * |
@weekly | 0 0 * * 0 |
@daily | 0 0 * * * |
@hourly | 0 * * * * |
Cron в разных средах
Синтаксис из пяти полей универсален, но способ настройки cron зависит от платформы.
Linux Crontab
Классика. Редактируйте пользовательский crontab командой crontab -e:
# Запуск резервного копирования каждый день в 2 часа ночи
0 2 * * * /home/user/scripts/backup.sh >> /var/log/backup.log 2>&1
Системные cron-задачи в /etc/cron.d/ включают дополнительное поле пользователя:
0 2 * * * root /usr/local/bin/cleanup.sh
GitHub Actions
GitHub Actions использует тот же синтаксис из пяти полей в триггере schedule. Все времена — UTC.
on:
schedule:
- cron: '0 3 * * 1-5' # Будни в 3 часа ночи UTC
Для детального изучения конфигурации YAML см. YAML для Kubernetes и YAML для Docker Compose.
Kubernetes CronJob
Kubernetes оборачивает cron-выражения в ресурс CronJob:
apiVersion: batch/v1
kind: CronJob
metadata:
name: nightly-report
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: report
image: reporting:latest
command: ["python", "generate_report.py"]
restartPolicy: OnFailure
Kubernetes по умолчанию использует UTC. Начиная с v1.25, можно установить timeZone: "Europe/Moscow" в спецификации CronJob.
AWS CloudWatch (EventBridge)
AWS использует несколько отличающийся синтаксис с шестью полями (добавлены секунды) и обёртками rate() / cron():
cron(0 3 * * ? *) # Ежедневно в 3 часа ночи UTC
Обратите внимание на символ ? — AWS требует его для дня месяца или дня недели, когда другое поле указано. Это отличается от стандартного cron.
Типичные ошибки
1. Путаница с часовыми поясами
Cron на Linux использует системный часовой пояс по умолчанию, но Kubernetes и GitHub Actions работают в UTC. Задача с расписанием 0 9 * * * сработает в 9 утра UTC, что соответствует 12:00 по московскому времени.
Всегда проверяйте, какой часовой пояс использует ваш планировщик. Для конвертации временных меток наше руководство Временная метка Unix — объяснение подробно описывает смещения UTC.
2. Пересекающиеся выполнения
Если задача выполняется дольше интервала между запусками, вы получите пересекающиеся экземпляры. Скрипт, работающий 8 минут при расписании */5 * * * *, будет накапливаться.
Решения:
- Используйте файл блокировки (
flockв Linux) - Установите
concurrencyPolicy: Forbidв CronJob Kubernetes - Проверяйте наличие запущенных экземпляров в начале скрипта
3. Отсутствие вывода и отладка
Cron не захватывает stdout по умолчанию. Всегда перенаправляйте вывод:
*/5 * * * * /path/to/script.sh >> /var/log/myjob.log 2>&1
Если cron-задача не выполняется, проверьте:
grep CRON /var/log/syslogдля журналов выполнения- Права доступа к файлу скрипта
- Переменную окружения
PATH— у cron минимальныйPATHпо умолчанию
4. Ловушка «31-е число каждого месяца»
0 0 31 * * # Выполняется только в месяцах с 31 днём
Это срабатывает в январе, марте, мае, июле, августе, октябре и декабре — но молча пропускает остальные пять месяцев. Если нужна задача на конец месяца, рассмотрите запуск 1-го числа с корректировкой логики скрипта или используйте инструмент с поддержкой семантики «последний день месяца».
5. Забытый перевод строки в конце crontab
Некоторые реализации cron требуют завершающего перевода строки в файле crontab. Если последняя запись не выполняется, добавьте пустую строку в конец.
Визуальное создание выражений
Запоминание синтаксиса работает для типичных паттернов, но сложные расписания проще создавать визуально. Конструктор Cron-выражений на alltools.one позволяет:
- Выбирать значения для каждого поля через выпадающие списки
- Видеть читаемое описание расписания
- Просматривать ближайшие времена выполнения
- Копировать итоговое выражение одним кликом
Работает полностью в браузере — данные не отправляются ни на какой сервер.
Карточка быстрого справочника
Скопируйте этот блок в документацию проекта или вики команды:
# ┌───── мин (0-59)
# │ ┌───── час (0-23)
# │ │ ┌───── день месяца (1-31)
# │ │ │ ┌───── месяц (1-12)
# │ │ │ │ ┌───── день недели (0-7, Вс=0 или 7)
# │ │ │ │ │
# * * * * *
*/5 * * * * # Каждые 5 минут
0 * * * * # Каждый час
0 0 * * * # Ежедневно в полночь
0 9 * * 1-5 # Будни в 9 утра
0 0 1 * * # Первое число месяца
*/15 9-17 * * 1-5 # Каждые 15 мин, рабочее время
Дополнительное чтение
- Временная метка Unix — объяснение — Понять время epoch и конвертацию часовых поясов
- YAML для Kubernetes — Настроить CronJob и другие ресурсы Kubernetes
- YAML для Docker Compose — Планировать контейнеры в конфигурациях compose
Готовы создать своё следующее cron-выражение? Откройте Конструктор Cron-выражений и настройте расписание правильно с первого раза.