ДЕНЬ 10: Ремесленник скриптов

LinuxBeginner
Практиковаться сейчас

Введение

Приветствуем вас, будущий системный администратор! Вы только что устроились в динамично развивающуюся IT-компанию на позицию младшего DevOps-инженера. Ваш старший коллега ушел в заслуженный отпуск, и на ваш стол как раз легла критически важная задача. Основной сервер приложений генерирует огромное количество лог-файлов, которые стремительно поглощают дисковое пространство. Ваша миссия — стать настоящим Ремесленником скриптов.

Вам необходимо создать автоматизированный shell-скрипт для управления этими логами. Речь идет не просто о запуске пары команд, а о создании надежного инструмента многократного использования. Вы начнете с простого скрипта и будете постепенно добавлять в него такие возможности, как переменные, ввод данных пользователем, проверку ошибок и циклы. К концу этого испытания вы создадите скрипт, способный создавать резервные копии и управлять файлами, доказав свою ценность для команды!

Приступим к написанию кода!

Важное примечание
Предстоящие задачи могут выходить за рамки курса Быстрый старт в Linux.
Если вы столкнетесь с трудностями во время прохождения:
  1. Временно пропустите это испытание и продолжите изучение следующих обучающих лабораторных работ в рамках пути обучения Linux.
  2. Обсудите проблему с 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-инженера или системного администратора. Навыки, которые вы здесь отработали, являются основой для написания гораздо более сложных систем автоматизации, способных управлять серверами, развертывать приложения и обрабатывать данные. Вы доказали, что можете брать на себя ответственность и предоставлять работающее решение. Отличная работа!

✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться