Цель урока: Освоить системный планировщик cron, который является сердцем автоматизации в Linux. Мы научимся читать, понимать и создавать задания для cron, чтобы наши скрипты и команды запускались автоматически в заданное время без нашего участия. Этот урок также затронет важные нюансы безопасности и окружения cron, чтобы ваши скрипты работали надежно, как часы.
Часть 1: Теория. Ваш личный робот-помощник cron
Вспомните наш скрипт для резервного копирования. Он очень полезен, но чтобы он сработал, вам нужно каждый раз заходить на сервер по SSH и запускать его вручную командой ./backup.sh. Это неудобно и ненадежно.
В Linux есть специальная системная служба (демон), которая называется cron. Ее единственная задача - работать в фоновом режиме и, как часы, проверять каждую минуту: "А не пора ли мне запустить какую-нибудь задачу?".
Вы, как администратор, оставляете для cron специальные "записки" с инструкциями. Такая "записка" называется заданием cron (cron job) и содержит две части:
-
Время запуска: Когда именно нужно выполнить задачу (например, "каждую ночь в 3:15").
-
Команда для запуска: Что именно нужно выполнить (например, /root/scripts/backup.sh).
Для каждого пользователя в системе есть свой собственный файл с такими "записками". Этот файл называется crontab (cron table - таблица cron). cron регулярно заглядывает в эти файлы и выполняет задания от имени того пользователя, которому принадлежит crontab.
Часть 2: Практика. Команда crontab и безопасность
Для управления вашим личным файлом crontab используется одноименная команда.
Важное замечание о безопасности:
На протяжении нашего курса мы работаем от имени root для простоты обучения. Однако в реальной жизни действует принцип наименьших привилегий: если задача не требует прав суперпользователя (например, скрипт для обработки файлов в домашнем каталоге обычного пользователя), ее следует запускать из crontab этого самого пользователя. crontab пользователя root следует использовать только для общесистемных задач, таких как резервное копирование системных каталогов, обновление пакетов и т.д. Это помогает избежать привычки "всё делать через root".
Основные опции команды crontab:
-
crontab -e (edit): Редактировать файл crontab текущего пользователя. Это основная команда. При первом запуске система может предложить вам выбрать текстовый редактор. Выбирайте nano, он самый простой.
-
crontab -l (list): Показать (вывести на экран) содержимое вашего текущего файла crontab.
-
crontab -u пользователь -l: Показать crontab другого пользователя (требует прав root).
-
crontab -r (remove): Полностью удалить ваш файл crontab. Используйте с большой осторожностью!
Часть 3: Практика. Формат времени и специальные директивы
Каждая строка в файле crontab - это одно задание, и оно имеет строго определенный формат:
# ┌───────────── минута (0 - 59)
# │ ┌───────────── час (0 - 23)
# │ │ ┌───────────── день месяца (1 - 31)
# │ │ │ ┌───────────── месяц (1 - 12)
# │ │ │ │ ┌───────────── день недели (0 - 7) (Воскресенье = 0 или 7)
# │ │ │ │ │
# * * * * * /путь/к/команде аргумент1 аргумент2
-
Звездочка * - это специальный символ, означающий "каждый".
-
День недели: Важно помнить, что Воскресенье может быть обозначено и как 0, и как 7.
Примеры:
-
15 03 * * * - В 3 часа 15 минут ночи, каждый день.
-
00 04 * * 1 - В 4 часа 00 минут, каждый Понедельник (1).
-
*/10 * * * * - Каждые 10 минут.
Бонус: специальные директивы для простоты
Для частых сценариев существуют более простые и читаемые "псевдонимы":
-
@reboot - Выполнить один раз при каждой загрузке системы.
-
@yearly или @annually - Раз в год (0 0 1 1 *).
-
@monthly - Раз в месяц (0 0 1 * *).
-
@weekly - Раз в неделю (0 0 * * 0).
-
@daily или @midnight - Раз в день (0 0 * * *).
-
@hourly - Раз в час (0 * * * *).
Пример использования:
# То же самое, что и '0 0 * * *', но гораздо понятнее
@daily /root/scripts/my_daily_script.sh
Часть 4: Окружение cron - важнейший нюанс
Это самый важный момент, о который спотыкаются новички. Вы запускаете скрипт в терминале - он работает. Вы ставите его в cron - он не работает. Почему?
Ответ: cron запускает ваши команды в очень ограниченном, минимальном окружении.
-
Он не читает ваш файл ~/.bashrc или ~/.profile.
-
У него нет ваших псевдонимов (alias).
-
Его переменная PATH (список каталогов, где ищутся команды) очень короткая, обычно /usr/bin:/bin. Он не знает о существовании программ в /usr/local/bin и других местах.
Золотые правила для cron:
-
Всегда используйте полные пути! Не my_script.sh, а /root/scripts/my_script.sh. Не python, а /usr/bin/python3.
-
Если сомневаетесь, узнайте путь командой which: which tar покажет /bin/tar.
-
Для сложных случаев можно задать PATH прямо вверху файла crontab:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Часть 5: Практический сценарий. Автоматизируем резервное копирование
Шаг 1: Подготовка скрипта
Создадим простой, но надежный скрипт.
cd ~/scripts
nano simple_backup.sh
Вставьте в nano следующий код:
#!/bin/bash
# Указываем, куда сохранять бэкапы
BACKUP_DIR="/root/backups"
# Указываем, что именно бэкапить
SOURCE_DIR="/etc"
# Формируем имя файла с датой
FILENAME="backup_$(date +'%Y-%m-%d_%H-%M').tar.gz"
# Создаем каталог для бэкапов, если он не существует
mkdir -p "$BACKUP_DIR"
# Используем команду tar с полным путем для надежности
/bin/tar -czvf "$BACKUP_DIR/$FILENAME" "$SOURCE_DIR"
Сохраните (Ctrl+O, Enter) и выйдите (Ctrl+X).
Шаг 2: Делаем скрипт исполняемым
chmod +x simple_backup.sh
Шаг 3: Тестовый запуск вручную
Всегда проверяйте работу скрипта вручную перед автоматизацией!
./simple_backup.sh
Шаг 4: Открываем crontab для редактирования
crontab -e
Шаг 5: Добавление тестового и реального заданий
Спуститесь в самый конец файла и добавьте новую строку. Сначала добавим тестовое задание, которое будет запускаться каждую минуту, чтобы мы могли быстро проверить, работает ли cron.
Важно: Мы перенаправим вывод (>>) в лог-файл, чтобы видеть, что cron действительно запускает нашу команду. Это лучший способ отладки.
Добавьте эту строку:
# Тестовое задание для проверки работы cron
* * * * * /bin/date >> /root/cron_test.log 2>&1
Сохраните файл (Ctrl+O, Enter) и выйдите (Ctrl+X). Подождите одну-две минуты, а затем проверьте содержимое лога:
cat /root/cron_test.log
Если вы видите там строки с датой - `cron` работает!
Шаг 6: Устанавливаем реальное задание
Теперь, когда мы уверены, что cron работает, поставим нашу настоящую задачу.
-
Снова откройте crontab:
crontab -e
-
Удалите или закомментируйте (поставьте # в начале) нашу тестовую строку с date.
-
Добавьте новую строку для запуска нашего скрипта, используя директиву @daily.
# Ежедневное резервное копирование системных конфигураций
@daily /root/scripts/simple_backup.sh >> /root/backup.log 2>&1
Сохраните и закройте файл. Теперь ваш сервер будет автоматически создавать резервную копию каталога /etc каждую полночь.
Проверить, что задание добавлено, можно командой: crontab -l
Часть 6: Заключение
Мы освоили cron - один из самых мощных инструментов в арсенале системного администратора. Вы научились не просто синтаксису, а всей процедуре: от подготовки и тестирования скрипта до безопасного добавления задания в crontab и проверки его работы через логи. Что еще важнее, вы теперь знаете о подводных камнях, связанных с окружением cron, и о принципах безопасности при выборе пользователя для выполнения задач.
На следующем, 22-м уроке, мы углубимся в тему управления пользователями. Мы уже знаем, как создавать пользователей, но теперь мы изучим, как управлять их "окружением": изменять их домашние каталоги, оболочки по умолчанию (shell), добавлять их в несколько групп и работать с файлами /etc/passwd, /etc/shadow и /etc/group, чтобы лучше понимать, как система хранит информацию о пользователях.
Перейти к просмотру - УРОК №22.
Промо-код: PROMO15 - скидка 15%!
Введите при оформлении первого заказа на сайте: Hosting-VDS.com