Введение
Добро пожаловать, будущий системный администратор! Вы только что присоединились к динамично развивающейся технологической компании в качестве младшего инженера DevOps. Ваш старший коллега отправился в заслуженный отпуск, а на ваш стол тем временем легла важная задача. Основной сервер приложений создаёт множество файлов журналов, которые стремительно расходуют дисковое пространство. Ваша миссия — стать Мастером сценариев.
Вам предстоит создать автоматизированный сценарий оболочки для управления этими файлами журналов. Речь идёт не просто о выполнении нескольких команд, а о создании надёжного и многократно используемого инструмента. Вы начнёте с простого сценария, а затем постепенно добавите в него переменные, пользовательский ввод, проверку ошибок и циклы. К концу задания у вас будет готов сценарий, способный создавать резервные копии и управлять файлами. Вы докажете свою ценность команде и спасёте положение!
Приступим к написанию сценария!
- Временно пропустите это задание и продолжите работу с последующими практическими лабораторными работами в рамках учебного пути по Linux.
- Обратитесь к Labby или просмотрите решение.
Написание простого сценария оболочки
Сначала необходимо заложить основу. Каждый хороший сценарий начинается с одной строки. Вам нужно создать файл сценария и добавить простую команду, чтобы убедиться, что всё работает правильно. Этот первоначальный шаг подтвердит корректность настройки и готовность к созданию более сложной логики.
Задачи
- Создайте новый файл сценария оболочки с именем
log_manager.shв каталоге~/project. - Добавьте в самый верх сценария строку «shebang» (
#!/bin/bash). Она указывает системе, какой интерпретатор следует использовать. - Добавьте команду для вывода на экран сообщения "Log Manager Initialized.".
- Сделайте сценарий исполняемым с помощью команды
chmod +x.
Требования
- Сценарий должен называться
log_manager.sh. - Сценарий должен находиться в каталоге
~/project. - Первая строка должна быть
#!/bin/bash. - Для вывода требуемого сообщения сценарий должен использовать команду
echo. - Сценарий должен иметь права на выполнение (используйте
chmod +x log_manager.sh).
Примеры
После создания сценария и назначения ему права на выполнение весь процесс должен выглядеть следующим образом:
Сначала убедитесь, что файл сценария существует:
ls ~/project/
log_manager.sh
Назначьте сценарию права на выполнение:
chmod +x ~/project/log_manager.sh
Теперь запустите сценарий:
./log_manager.sh
Сценарий должен вывести:
Log Manager Initialized.
Также можно проверить содержимое сценария:
cat ~/project/log_manager.sh
Файл должен содержать:
#!/bin/bash
echo "Log Manager Initialized."
Подсказки
- Для создания и редактирования файла можно использовать текстовый редактор командной строки, например
nano. Например:nano log_manager.sh. - Команда
echoиспользуется для вывода строки текста. - Используйте
chmod +x filename, чтобы сделать сценарий исполняемым. Параметр+xдобавляет владельцу файла право на выполнение.
Добавление переменных и пользовательского ввода
Сценарий с жёстко заданными значениями не отличается гибкостью. Чтобы сделать его более динамичным и пригодным для повторного использования, теперь добавим переменные. Вы определите переменную для каталога с журналами и запросите у пользователя метку запуска резервного копирования. Благодаря этому сценарий можно будет адаптировать к разным ситуациям без изменения самого кода.
Задачи
- Измените сценарий
log_manager.sh. - Определите переменную с именем
LOG_DIRи присвойте ей путь/home/labex/project/app_logs. - Добавьте строку, выводящую "Enter the backup filename: " для запроса пользовательского ввода.
- Используйте команду
read, чтобы сохранить введённое пользователем значение в новую переменнуюBACKUP_FILENAME. - Добавьте завершающую команду
echo, подтверждающую настройки и выводящую сообщение вида "Backing up logs to: [filename]", где[filename]— значение, введённое пользователем.
Требования
- В сценарии должна присутствовать переменная
LOG_DIR, содержащая значение/home/labex/project/app_logs. - Для получения данных от пользователя сценарий должен использовать команду
read. - Введённое пользователем значение должно сохраняться в переменной
BACKUP_FILENAME. - В итоговом выводе должна использоваться переменная
$BACKUP_FILENAME.
Примеры
При запуске изменённый сценарий должен запросить ввод и вывести сообщение с подтверждением. Взаимодействие должно выглядеть примерно так:
./log_manager.sh
Log Manager Initialized.
Enter the backup filename: daily_backup
Backing up logs to: daily_backup
Сценарий должен остановиться на приглашении "Enter the backup filename:", ожидая, пока пользователь введёт имя и нажмёт Enter. После ввода будет выведено сообщение с подтверждением, использующее указанное значение. В этом задании это значение является меткой запуска, отображаемой в выводе; фактическое резервное копирование реализуется на шаге 4 путём копирования файлов .log в ~/project/backups.
Подсказки
- Для определения переменной используйте синтаксис
VARIABLE_NAME="value". Вокруг знака=не должно быть пробелов. - Чтобы обратиться к значению переменной, поставьте перед её именем знак
$, например$MY_VARIABLE. - Команда
readприостанавливает сценарий и ожидает, пока пользователь что-либо введёт и нажмёт Enter.
Реализация условной логики
Хороший сценарий должен учитывать возможные проблемы. Что произойдёт, если указанный каталог с журналами не существует? Сценарий завершится с ошибкой. Чтобы сделать его надёжнее, добавьте условную логику. С помощью оператора if вы проверите существование каталога с журналами перед выполнением каких-либо операций.
Задачи
- Измените сценарий
log_manager.sh. - Добавьте оператор
if, проверяющий существование каталога, указанного переменной$LOG_DIR. - Если каталог существует, сценарий должен продолжить работу как раньше: запросить имя файла и т. д.
- Если каталог не существует, сценарий должен вывести сообщение об ошибке "Error: Log directory not found." и немедленно завершиться с ненулевым кодом возврата.
Требования
- Сценарий должен использовать оператор
if. - Условие должно проверять существование каталога с помощью оператора тестирования
-d. - Если каталог не существует, сценарий должен вывести указанное сообщение об ошибке с помощью
echo. - Если каталог не существует, сценарий должен завершиться командой
exit 1.
Примеры
Если каталог с журналами существует, сценарий должен работать в обычном режиме:
./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: test_backup.tar.gz
Backing up logs to: test_backup.tar.gz
Если каталог с журналами отсутствует, сценарий должен вывести ошибку и завершиться:
./log_manager.sh
Log Manager Initialized.
Error: Log directory not found.
В этом случае сценарий немедленно завершится после вывода сообщения об ошибке, не запрашивая пользовательский ввод и не переходя к операциям резервного копирования.
Подсказки
- Синтаксис базового оператора
if:if [ condition ]; then ... else ... fi. - Проверка
[ -d "$DIRECTORY_PATH" ]возвращает истину, если$DIRECTORY_PATHсуществует и является каталогом. exit 1— стандартный способ сообщить о завершении сценария с ошибкой.
Циклическая обработка файлов
Теперь переходим к главной части автоматизации! Вам предстоит обработать файлы, находящиеся в каталоге с журналами. С помощью цикла for вы переберёте все файлы с расширением .log в каталоге app_logs. В рамках этого задания их нужно просто скопировать в новый каталог резервных копий. Введённое значение BACKUP_FILENAME остаётся меткой запуска, отображаемой в выводе, а не именем создаваемого архивного файла.
Задачи
- Сначала создайте каталог
backupsвнутри~/project, куда будут копироваться файлы журналов. - Измените сценарий
log_manager.sh. - Внутри блока
if, где подтверждается существование каталога, добавьте циклfor. - Цикл должен перебрать все файлы, заканчивающиеся на
.log, внутри каталога$LOG_DIR. - Внутри цикла используйте команду
cp, чтобы скопировать каждый файл журнала в каталог~/project/backups. - Для каждого скопированного файла выводите сообщение вида "Copied [filename]".
Требования
- Сначала необходимо создать каталог
~/project/backupsиз командной строки. - Сценарий должен использовать цикл
for. - Цикл должен перебирать файлы в
$LOG_DIR, соответствующие шаблону*.log. - Внутри цикла необходимо использовать команду
cpдля копирования файлов в~/project/backups. - Оператор
echoдолжен сообщать имя каждого копируемого файла.
Примеры
После выполнения этого шага при запуске сценария с указанием имени резервной копии должны обрабатываться все файлы журналов и выводиться примерно следующие сообщения:
./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: daily_backup
Backing up logs to: daily_backup
Copied /home/labex/project/app_logs/access.log
Copied /home/labex/project/app_logs/debug.log
Copied /home/labex/project/app_logs/error.log
Backup complete.
Сценарий должен перебрать каждый файл .log в каталоге и вывести сообщение "Copied" для каждого из них. Точные имена файлов зависят от содержимого каталога app_logs.
После завершения сценария можно проверить, были ли файлы скопированы, просмотрев каталог backups:
ls ~/project/backups/
access.log debug.log error.log
Подсказки
- Для создания каталога можно использовать команду
mkdir. - Цикл
forдля обработки файлов можно записать так:for file in /path/to/*.log; do ... done. - Синтаксис команды
cp:cp <source> <destination>. - Переменная цикла, например
file, на каждой итерации будет содержать полный путь к файлу.
Итоги
Поздравляем, Мастер сценариев! Вы с нуля создали полноценный рабочий сценарий оболочки. Вы взялись за реальную задачу — управление файлами журналов — и решили её с помощью автоматизации.
В этом задании вы освоили несколько фундаментальных концепций написания сценариев оболочки:
- Создание и структурирование сценария с помощью shebang.
- Использование переменных для придания сценарию динамичности.
- Получение пользовательского ввода с помощью
read. - Реализация надёжной проверки ошибок с помощью операторов
if. - Автоматизация повторяющихся задач с помощью циклов
for. - Управление правами доступа к файлам и запуск сценария.
Теперь ваш сценарий умеет автоматически проверять существование каталогов с журналами, обрабатывать все файлы журналов и копировать их в место хранения резервных копий. Это большой шаг на вашем пути к профессии инженера DevOps или системного администратора. Полученные навыки станут основой для написания гораздо более сложных сценариев автоматизации, способных управлять серверами, развёртывать приложения и обрабатывать данные. Вы доказали, что умеете брать на себя ответственность и доводить дело до рабочего результата. Отличная работа!



