Синтаксис 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 — это простой и надёжный способ автоматизировать рутину на сервере. Освойте базовый синтаксис, и вы сможете настроить любое расписание — от ежеминутных проверок до ежемесячных отчётов.