Введение
Приветствуем вас, будущий системный администратор! Вы только что устроились в динамично развивающуюся IT-компанию на позицию младшего DevOps-инженера. Ваш старший коллега ушел в заслуженный отпуск, и на ваш стол как раз легла критически важная задача. Основной сервер приложений генерирует огромное количество лог-файлов, которые стремительно поглощают дисковое пространство. Ваша миссия — стать настоящим Ремесленником скриптов.
Вам необходимо создать автоматизированный shell-скрипт для управления этими логами. Речь идет не просто о запуске пары команд, а о создании надежного инструмента многократного использования. Вы начнете с простого скрипта и будете постепенно добавлять в него такие возможности, как переменные, ввод данных пользователем, проверку ошибок и циклы. К концу этого испытания вы создадите скрипт, способный создавать резервные копии и управлять файлами, доказав свою ценность для команды!
Приступим к написанию кода!
- Временно пропустите это испытание и продолжите изучение следующих обучающих лабораторных работ в рамках пути обучения Linux.
- Обсудите проблему с Labby или посмотрите готовое решение.
Написание простого shell-скрипта
Ваша первая задача — заложить фундамент. Каждый великий скрипт начинается с одной строки. Вам нужно создать файл скрипта и добавить в него базовую команду, чтобы убедиться в его работоспособности. Этот начальный этап подтвердит, что ваша среда настроена правильно и вы готовы к созданию более сложной логики.
Задачи
- Создайте новый файл shell-скрипта с именем
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: my_backup_2024.tar.gz
Backing up logs to: my_backup_2024.tar.gz
Скрипт должен остановиться на приглашении "Enter the backup filename:", ожидая, пока пользователь введет имя файла и нажмет Enter. После ввода данных скрипт выведет подтверждение с использованием этого имени.
Подсказки
- Для определения переменной используйте синтаксис
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. В рамках этого испытания вы просто скопируете их в новую директорию для бэкапов.
Задачи
- Сначала создайте директорию с именем
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: full_backup.tar.gz
Backing up logs to: full_backup.tar.gz
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 <источник> <назначение>. - Переменная цикла (например,
file) на каждой итерации будет содержать полный путь к файлу.
Резюме
Поздравляем, Ремесленник скриптов! Вы успешно создали полноценный и функциональный shell-скрипт с нуля. Вы взяли реальную задачу — управление лог-файлами — и решили её с помощью автоматизации.
В этом испытании вы освоили несколько фундаментальных концепций написания скриптов:
- Создание и структурирование скрипта с использованием shebang.
- Использование переменных для придания скрипту динамичности.
- Получение данных от пользователя с помощью
read. - Реализация надежной проверки ошибок с помощью операторов
if. - Автоматизация повторяющихся задач с помощью циклов
for. - Управление правами доступа к файлам и запуск скрипта.
Теперь ваш скрипт может автоматически проверять наличие директорий, обрабатывать все лог-файлы и копировать их в место резервного хранения. Это огромный шаг в вашем становлении как DevOps-инженера или системного администратора. Навыки, которые вы здесь отработали, являются основой для написания гораздо более сложных систем автоматизации, способных управлять серверами, развертывать приложения и обрабатывать данные. Вы доказали, что можете брать на себя ответственность и предоставлять работающее решение. Отличная работа!



