ttools
cronавтоматизациясерверадминистрирование

Синтаксис CRON: как правильно написать расписание для автоматизации

Разберите синтаксис CRON-выражений: минуты, часы, дни недели. Примеры для бэкапов, отправки писем и парсинга данных.

CRON — это планировщик задач в Unix-подобных системах, который запускает команды или скрипты по расписанию. Вместо того чтобы вручную каждый день делать бэкап или отправлять отчёты, вы пишете одну строку — и сервер делает всё сам. Разберём, как работает синтаксис CRON-выражений и как применять его для реальных задач.

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

CRON-выражение состоит из пяти полей, разделённых пробелами:

* * * * * команда
│ │ │ │ │
│ │ │ │ └─── День недели (0-7, где 0 и 7 — воскресенье)
│ │ │ └───── Месяц (1-12)
│ │ └─────── День месяца (1-31)
│ └───────── Час (0-23)
└─────────── Минута (0-59)

Звёздочка * означает «любое значение». Например, * * * * * — запуск каждую минуту.

Специальные символы

  • * — любое значение
  • , — список (например, 1,15 — первое и пятнадцатое число)
  • - — диапазон (1-5 — с понедельника по пятницу)
  • / — шаг (*/15 — каждые 15 минут)

Ежедневные задачи: бэкапы и очистка логов

Бэкап базы данных каждый день в 3 ночи

0 3 * * * /usr/bin/mysqldump -u root -p'password' database > /backups/db_$(date +\%Y\%m\%d).sql

Здесь 0 3 * * * означает: 0 минут, 3 часа утра, любой день месяца, любой месяц, любой день недели. Команда создаёт дамп базы с датой в названии файла.

Очистка временных файлов каждый день в полночь

0 0 * * * find /tmp -type f -mtime +7 -delete

Удаляет файлы из /tmp старше семи дней. Запускается в 00:00 каждый день.

Бэкап в рабочие дни в 18:00

0 18 * * 1-5 tar -czf /backups/project_$(date +\%Y\%m\%d).tar.gz /var/www/project

1-5 — с понедельника по пятницу. Архив создаётся только в будние дни после окончания рабочего времени.

Еженедельные и ежемесячные задачи

Еженедельный отчёт по понедельникам в 9 утра

0 9 * * 1 /usr/bin/python3 /scripts/weekly_report.py

1 в поле «день недели» — понедельник. Скрипт генерирует отчёт за прошедшую неделю и отправляет по email.

Очистка старых логов в первый день месяца

0 2 1 * * find /var/log/app -name "*.log" -mtime +30 -delete

1 в поле «день месяца» — первое число. Запуск в 02:00, удаление логов старше 30 дней.

Синхронизация данных каждое воскресенье в 4 утра

0 4 * * 0 rsync -avz /data/ backup-server:/remote/data/

0 (или 7) — воскресенье. Копирование данных на резервный сервер раз в неделю.

Ежечасная и частая синхронизация

Проверка новых заказов каждые 15 минут

*/15 * * * * /usr/bin/php /var/www/scripts/check_orders.php

*/15 — каждые 15 минут (0, 15, 30, 45). Скрипт опрашивает API и обновляет статусы заказов.

Парсинг цен конкурентов каждый час

0 * * * * /usr/bin/python3 /scripts/parse_prices.py

0 * — в начале каждого часа (00:00, 01:00, 02:00...). Скрипт собирает данные и записывает в базу.

Отправка писем каждые 5 минут в рабочее время

*/5 9-17 * * 1-5 /usr/bin/node /scripts/send_emails.js

*/5 — каждые 5 минут, 9-17 — с 9 утра до 5 вечера, 1-5 — будние дни. Обработка очереди писем только в рабочее время.

Комбинированные условия

Бэкап дважды в день: утром и вечером

0 9,21 * * * /scripts/backup.sh

9,21 — в 9:00 и 21:00. Можно указать несколько значений через запятую.

Отчёт в первый и пятнадцатый день месяца

0 10 1,15 * * /usr/bin/php /scripts/monthly_report.php

1,15 в поле «день месяца» — дважды в месяц в 10:00.

Ночное обслуживание в выходные

0 2 * * 6,0 /scripts/maintenance.sh

6,0 — суббота и воскресенье. Тяжёлые операции выполняются ночью, когда нагрузка минимальна.

Настройка CRON: добавление задач

Редактировать CRON-задачи можно командой:

crontab -e

Откроется редактор, где каждая строка — отдельная задача. Сохраните файл, и CRON автоматически подхватит изменения.

Посмотреть текущие задачи:

crontab -l

Для логирования добавьте перенаправление вывода:

0 3 * * * /scripts/backup.sh >> /var/log/backup.log 2>&1

>> /var/log/backup.log — дописывает stdout в файл, 2>&1 — туда же отправляет stderr.

Типичные ошибки и их решения

Переменные окружения

CRON запускается в минимальном окружении, без PATH и других переменных. Указывайте полные пути к командам:

# Плохо
0 3 * * * backup.sh

# Хорошо
0 3 * * * /home/user/scripts/backup.sh

Или явно задайте PATH в начале crontab:

PATH=/usr/local/bin:/usr/bin:/bin
0 3 * * * backup.sh

Проблемы с процентами

Символ % в CRON имеет особое значение (начало stdin). Экранируйте его обратным слэшем:

# Неправильно
0 3 * * * backup_$(date +%Y%m%d).sh

# Правильно
0 3 * * * backup_$(date +\%Y\%m\%d).sh

Отсутствие логов

По умолчанию вывод CRON отправляется на email пользователя. Если письма не приходят, настройте логирование вручную или проверьте системные логи:

grep CRON /var/log/syslog

Инструменты для работы с расписаниями

Если нужно быстро проверить формат CRON-выражения или преобразовать дату для логики приложения, используйте онлайн-инструменты. CRON Expression Parser покажет расшифровку выражения и ближайшие даты запуска. Для работы с датами в JavaScript пригодится Unix Timestamp Converter — конвертирует временные метки в читаемый формат и обратно.

CRON — это простой и надёжный способ автоматизировать рутину на сервере. Освойте базовый синтаксис, и вы сможете настроить любое расписание — от ежеминутных проверок до ежемесячных отчётов.

Инструменты по теме