Автоматизация в Linux с помощью Cron
| Уровень сложности | Лёгкий |
| Права root | Требуются |
| Требования | Терминал Linux |
| Категория | Установка ПО |
| Совместимость с ОС | Debian, Ubuntu, RHEL |
| Примерное время чтения | 15 мин. |
Введение
Практически на каждом Linux-сервере регулярно выполняются десятки фоновых задач:
-
резервное копирование;
-
очистка временных файлов;
-
обновление баз данных;
-
выпуск SSL-сертификатов;
-
мониторинг сервисов;
-
отправка уведомлений.
Большинство таких операций запускается автоматически благодаря сервису Cron.
Cron - это встроенный планировщик задач Linux, который позволяет выполнять команды и скрипты по расписанию.
Например:
-
каждый день в 03:00 создавать резервную копию;
-
каждые 5 минут проверять доступность сайта;
-
каждый час очищать временные файлы;
-
каждое воскресенье отправлять отчёт на почту.
Инструкция
Проверяем, установлен ли Cron
На большинстве дистрибутивов он уже установлен.
Проверить статус можно командой:
systemctl status cron
Для некоторых дистрибутивов:
systemctl status crond
Если сервис работает, вы увидите:
Запуск и автозапуск Cron
Запуск:
systemctl start cron
Автозапуск при загрузке системы:
systemctl enable cron
Проверка:
systemctl is-enabled cron
Что такое Crontab
Crontab (Cron Table) - это файл с расписанием задач, который используется службой Cron для автоматического запуска команд и скриптов по заданному времени.
Посмотреть задачи текущего пользователя:
crontab -l
Редактировать:
crontab -e
Удалить все задачи:
crontab -r
Структура записи Cron
Типичная запись выглядит так:
0 3 * * * /root/backup.sh
Разберём её по частям:
┌──────── минута
│ ┌────── час
│ │ ┌──── день месяца
│ │ │ ┌── месяц
│ │ │ │ ┌ день недели
│ │ │ │ │
0 3 * * * команда
Значения полей
Минуты
0-59
Пример:
15 * * * *
Каждый час в 15 минут.
Часы
0-23
Пример:
0 2 * * *
Каждый день в 02:00.
День месяца
1-31
Пример:
0 5 1 * *
Первого числа каждого месяца.
Месяц
1-12
Пример:
0 0 * 12 *
Каждый день в декабре.
День недели
0-7
Где:
0 и 7 = воскресенье
1 = понедельник
Пример:
0 10 * * 1
Каждый понедельник в 10:00.
Специальный символ *
Означает:
любое значение
Например:
* * * * *
Команда будет выполняться каждую минуту.
Выполнение каждые 5 минут
*/5 * * * * команда
Пример:
*/5 * * * * curl https://wiki.planetahost.ru/
Выполнение каждые 10 минут
*/10 * * * * команда
Выполнение каждый час
0 * * * * команда
Выполнение раз в сутки
0 0 * * * команда
Полночь каждого дня.
Выполнение по будням
0 9 * * 1-5 команда
С понедельника по пятницу.
Выполнение по выходным
0 10 * * 6,0 команда
Выполнение нескольких раз в день
Например:
0 6,12,18 * * * команда
Запуск:
-
06:00
-
12:00
-
18:00
Реальные примеры
Резервное копирование
Скрипт:
#!/bin/bash
tar -czf /backup/site-$(date +%F).tar.gz /var/www
Cron:
0 3 * * * /root/backup.sh
Скрипт создаёт сжатый архив каталога /var/www и сохраняет его в папку /backup. каждый день в 03:00.
Проверка сайта
Cron:
*/5 * * * * curl -fs https://wiki.planetahost.ru/ >/dev/null
Эта задача Cron каждые 5 минут отправляет HTTP-запрос на сайт https://wiki.planetahost.ru/, чтобы проверить его доступность. Параметры -f и -s заставляют curl работать тихо и возвращать ошибку при проблемах с доступом к сайту.
Очистка логов
Cron:
0 2 * * 0 find /var/log/app -type f -mtime +30 -delete
Эта задача запускается каждое воскресенье в 02:00 и удаляет из каталога /var/log/app все файлы, которые были изменены более 30 дней назад.
Перенаправление вывода
По умолчанию Cron пытается отправлять результаты выполнения по почте. Чаще всего это не требуется.
Отключить вывод:
0 3 * * * /root/backup.sh > /dev/null 2>&1
Запись в лог
Полезнее сохранять результат:
0 3 * * * /root/backup.sh >> /var/log/backup.log 2>&1
Почему скрипт работает вручную, но не работает в Cron
Самая распространённая проблема.
Например:
/root/script.sh
работает, но через Cron - нет.
Причина обычно в переменной PATH.
Неправильно
*/5 * * * * php script.php
Правильно
Сначала узнать путь:
which php
Например:
/usr/bin/php
После чего:
*/5 * * * * /usr/bin/php /root/script.php
Проверяем логи Cron
Для Debian и Ubuntu:
grep CRON /var/log/syslog
Для RHEL и CentOS:
grep CROND /var/log/cron
Выполнение задачи после перезагрузки
Для этого используется специальное слово:
@reboot
Пример:
@reboot /root/startup.sh
Скрипт выполнится после загрузки системы.
Полезные специальные записи
Каждый час:
@hourly
Каждый день:
@daily
Каждую неделю:
@weekly
Каждый месяц:
@monthly
Каждый год:
@yearly
Как избежать запуска нескольких копий скрипта
Частая проблема, если задача выполняется 15 минут, а Cron запускает её каждые 5 минут:
*/5 * * * * script.sh
Начнут накапливаться процессы.
Решение:
*/5 * * * * flock -n /tmp/script.lock /root/script.sh
Пока работает одна копия, новая не запустится.
Проверка синтаксиса Cron
Полезный сервис: crontab.guru
Там можно быстро проверить расписание.
Например:
*/15 * * * *
Сервис сразу покажет:
Every 15 minutes
Безопасность
Не рекомендуется:
-
запускать всё от root;
-
использовать права 777;
-
хранить пароли в скриптах;
-
запускать непроверенные команды через Cron.
Лучше создавать отдельного пользователя для автоматизации задач.
Заключение
Cron остаётся одним из самых простых и надёжных инструментов автоматизации в Linux. С его помощью можно выполнять как простые команды, так и сложные сценарии резервного копирования, мониторинга и обслуживания серверов.
Главное - использовать абсолютные пути к программам, проверять журналы системы и тестировать команды вручную перед добавлением в расписание. В этом случае Cron станет надёжным помощником в повседневном администрировании Linux-серверов.




