Мастер сценариев

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

Введение

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

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

Приступим к написанию сценария!

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

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