Cron — это демон (фоновый процесс) операционной системы Linux/Unix, который позволяет выполнять команды или скрипты в заранее заданное время или с определенной периодичностью. Это ключевой инструмент для любого системного администратора и разработчика, который стремится к автоматизации и поддержанию работоспособности сервера.
Неправильная настройка cron может привести к невыполнению задач, перегрузке сервера или генерации огромного количества ненужных логов.
1. Основные концепции
1.1. Демон и Crontab
- Cron Demon: Основной процесс, который постоянно работает на сервере и в заданное время считывает инструкции.
- Crontab (Cron Table): Файл, который содержит список заданий (
cron jobs) и их расписание. У каждого пользователя на сервере может быть свой файлcrontab.
1.2. Команды управления Crontab
Для работы с расписанием текущего пользователя используются следующие команды:
| Команда | Действие | Примечание |
|---|---|---|
crontab -e | Редактировать файл crontab | Открывает файл в текстовом редакторе (обычно nano или vi). |
crontab -l | Показать текущий список заданий | Выводит расписание в терминал. |
crontab -r | Удалить все задания | Критически опасно! Удаляет весь файл crontab. |
2. Синтаксис Cron: Пять Звёздочек
Каждая строка в файле crontab состоит из шести полей. Первые пять полей определяют время и дату выполнения, а шестое — команду.
* * * * * /path/to/command/or/script
| | | | |
| | | | ----- День недели (0 - 7, где 0 и 7 = Воскресенье)
| | | ------- Месяц (1 - 12)
| | --------- День месяца (1 - 31)
| ----------- Час (0 - 23)
------------- Минута (0 - 59)
2.1. Использование операторов
Для задания гибкого расписания используются специальные операторы:
| Оператор | Название | Пример | Описание |
|---|---|---|---|
* | Звездочка | * | Любое значение. |
, | Запятая (Список) | 10,30,50 | В 10, 30 и 50 минут часа. |
- | Дефис (Диапазон) | 9-17 | С 9 утра до 5 вечера. |
/ | Слэш (Шаг) | */5 | Каждые 5 минут. |
2.2. Примеры базовых задач
Пример 1: Запуск скрипта ровно в полночь каждый день
Задача, идеально подходящая для ежедневного бэкапа или отчета.
0 0 * * * /usr/bin/php /var/www/site/backup.php
0: В нулевую минуту часа.0: В нулевой час (полночь).* * *: Каждый день, каждый месяц, любой день недели.
Пример 2: Запуск скрипта каждые 15 минут
Задача для проверки очереди сообщений или обновления кеша.
*/15 * * * * /bin/bash /scripts/cache_update.sh
*/15: Каждые 15 минут (0, 15, 30, 45).* * * *: Каждый час, каждый день.
Пример 3: Запуск в 8:30 утра только по рабочим дням
Задача для синхронизации данных или начала рабочей смены.
30 8 * * 1-5 /usr/local/bin/python3 /app/sync_data.py
30: В 30 минут часа.8: В 8 часов.* *: Каждый день, каждый месяц.1-5: С понедельника по пятницу.
3. Расширенные приемы и логирование
Профессиональные cron-задачи всегда должны обрабатывать свой вывод и ошибки, чтобы не засорять систему и иметь возможность диагностики.
3.1. Специальные сокращения (@shortcuts)
Для наиболее частых интервалов можно использовать текстовые сокращения вместо пяти звёздочек. Это делает расписание более читабельным.
| Сокращение | Эквивалент | Описание |
|---|---|---|
@reboot | (N/A) | Выполнить один раз при запуске системы. |
@yearly / @annually | 0 0 1 1 * | Раз в год (в полночь 1 января). |
@monthly | 0 0 1 * * | Раз в месяц (в полночь первого числа). |
@weekly | 0 0 * * 0 | Раз в неделю (в полночь воскресенья). |
@daily / @midnight | 0 0 * * * | Раз в день (в полночь). |
@hourly | 0 * * * * | Раз в час (в начале каждого часа). |
Пример:
@daily /usr/bin/php /var/www/site/backup.php
3.2. Обработка вывода и ошибок (Логирование)
По умолчанию cron отправляет любой вывод (stdout) и ошибки (stderr) на почту владельцу crontab. Чтобы избежать замусоривания почтового ящика, нужно перенаправить вывод в файл-лог.
Перенаправление вывода в лог-файл (игнорируем ошибки):
* * * * * /path/to/script.sh > /var/log/my_cron.log 2>&1
>: Перенаправляет стандартный вывод (результат работы) в указанный файл.2>&1: Перенаправляет стандартный поток ошибок (2) туда же, куда и стандартный вывод (1).
Игнорирование всего вывода (для абсолютно тихих задач):
* * * * * /path/to/silent_script.sh > /dev/null 2>&1
> /dev/null: Отправляет весь вывод и ошибки в “черную дыру”, полностью заглушая задачу.
4. Лучшие практики и безопасность
Эти приемы обеспечивают надежность и предотвращают одновременный запуск одной и той же задачи.
4.1. Установка переменной PATH
Cron запускается в минимальном окружении, поэтому он может не знать путь к исполняемым файлам (например, php или mysql). Всегда указывайте полный путь к исполняемым файлам (как в примерах выше: /usr/bin/php).
Или установите переменную PATH в начале файла crontab:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
* * * * * php /var/www/site/script.php
4.2. Защита от дублирования (Atomicity)
Что произойдет, если скрипт, который запускается каждые 5 минут, зависнет на 7 минут? Вторая копия скрипта запустится, пока работает первая, что может привести к порче данных. Используйте flock для блокировки:
# Пример: Запуск скрипта каждые 5 минут, но только если он не запущен
*/5 * * * * /usr/bin/flock -xn /tmp/my_script.lock -c "/usr/bin/php /var/www/site/script.php" >> /var/log/script.log 2>&1
/tmp/my_script.lock: Файл-блокировка.-x: Эксклюзивная блокировка (запрещает другим процессам писать в файл).-n: Немедленно выйти, если блокировка не удалась (т.е. скрипт уже запущен).-c: Команда для выполнения.
4.3. Безопасность и права доступа
- Права выполнения: Убедитесь, что скрипт имеет право на выполнение (
chmod +x script.sh). - Минимальные права: Всегда запускайте задачи под пользователем с минимально необходимыми правами (например, под пользователем
www-dataдля веб-приложений), а не подroot. Это предотвращает компрометацию всей системы в случае ошибки в скрипте.
Заключение
Cron-задачи — это фундамент надежного и автоматизированного веб-приложения. Освоение синтаксиса и применение лучших практик, таких как логирование (> /dev/null 2>&1), полные пути и блокировка дублирования (flock), превратит рутинные операции в предсказуемый и управляемый процесс, высвобождая ваше время для более важных задач.