Введение
Добро пожаловать, будущий системный администратор! Вы только что устроились в оживленную технологическую компанию на должность младшего DevOps-инженера. Ваш старший коллега ушел в заслуженный отпуск, и на ваш стол легла критически важная задача. Основной сервер приложений генерирует огромное количество лог-файлов, которые стремительно заполняют дисковое пространство. Ваша миссия, если вы решите ее принять, — стать Мастером скриптов (The Script Artisan).
Вам необходимо создать автоматизированный 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-инженера или системного администратора. Навыки, которые вы здесь отработали, являются фундаментом для написания гораздо более сложных скриптов автоматизации, способных управлять серверами, развертывать приложения и обрабатывать данные. Вы доказали, что можете брать на себя ответственность и предоставлять работающее решение. Отличная работа!



