Введение
Добро пожаловать, будущий системный администратор! Вы только что устроились в крупную технологическую компанию на должность младшего 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: 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) будет содержать полный путь к файлу на каждой итерации.
Резюме
Поздравляем, Мастер скриптов! Вы успешно создали полноценный, функциональный shell-скрипт с нуля. Вы взялись за реальную задачу — управление лог-файлами — и решили ее с помощью автоматизации.
В этом задании вы освоили несколько фундаментальных концепций написания shell-скриптов:
- Создание и структурирование скрипта с использованием shebang.
- Использование переменных для придания скрипту динамичности.
- Получение ввода пользователя с помощью
read. - Реализация надежной проверки ошибок с помощью операторов
if. - Автоматизация повторяющихся задач с помощью циклов
for. - Управление правами доступа к файлам и запуск вашего скрипта.
Теперь ваш скрипт может автоматически проверять наличие директорий логов, обрабатывать все лог-файлы и копировать их в место для резервного копирования. Это огромный шаг в вашем пути как DevOps-инженера или системного администратора. Навыки, которые вы здесь отработали, являются фундаментом для написания гораздо более сложных скриптов автоматизации, способных управлять серверами, развертывать приложения и обрабатывать данные. Вы доказали, что можете брать на себя ответственность и предоставлять работающее решение. Отличная работа!



