0Pricing
DevOps Bootcamp · Урок

Проект по расширенной разработке скриптов

Выполните комплексный проект, объединяющий все изученные концепции: от инструментов командной строки до продвинутых приёмов написания скриптов Bash.

«Проект по расширенной разработке скриптов» — бесплатный урок DevOps Bootcamp на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения DevOps Bootcamp, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс DevOps Bootcamp содержит 4 уроков всего.

Начало проекта: задача

Добро пожаловать в наш итоговый проект! На протяжении курса вы изучили множество мощных команд Linux и приёмов написания скриптов Bash. Теперь пришло время объединить их.

На этом уроке мы с нуля создадим практичный продвинутый скрипт Bash. Этот проект потребует от вас объединить всё изученное в одном работающем решении.

Определение цели проекта

Наша цель — создать скрипт мониторинга и архивирования файлов. Представьте, что сервер создаёт файлы журналов, которые нужно регулярно обрабатывать без ручного вмешательства.

Наш скрипт будет выполнять следующие действия:

  • непрерывно отслеживать определённый каталог в поисках новых текстовых файлов;
  • обрабатывать каждый новый файл (например, подсчитывать количество строк);
  • перемещать обработанный файл в каталог архива;
  • записывать в журнал все действия, включая метки времени и возникающие ошибки.

Основа скрипта: шебанг и переменные

Каждый хороший скрипт начинается с чёткой основы. Мы начнём с определения шебанга и настройки ключевых переменных. Благодаря этим переменным скрипт будет гибким и удобным для настройки.

Мы зададим пути к каталогу мониторинга, каталогу архива и файлу журнала.

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

Проверка существования каталогов

Прежде чем скрипт сможет выполнять мониторинг или архивирование, нужно убедиться, что необходимые каталоги существуют. Здесь особенно важна команда mkdir -p: она создаёт каталоги, только если их ещё нет, и не выдаёт ошибку, если они уже существуют.

Мы также добавим базовую обработку ошибок, чтобы корректно завершать работу при сбое создания каталога.

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

Цикл мониторинга

Наш скрипт должен работать непрерывно, чтобы отслеживать новые файлы. Для этого отлично подходит цикл while true. Внутри цикла мы будем использовать sleep, чтобы делать паузу в несколько секунд между проверками и не расходовать слишком много ресурсов.

Мы также будем записывать в журнал каждую проверку, чтобы отслеживать активность.

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

# --- Main Monitoring Loop ---
while true; do
  echo "$(date): Checking for new files in $MONITOR_DIR..." >> "$LOG_FILE"
  # File processing will go here
  sleep 5 # Check every 5 seconds
done

Поиск и обработка файлов

Внутри цикла нам нужно находить новые текстовые файлы. Для этого идеально подходит команда find в сочетании с циклом for, который обработает каждый найденный файл. На этапе обработки мы используем wc -l, чтобы подсчитать количество строк в каждом файле.

Это демонстрирует объединение инструментов командной строки в скрипте.

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

# --- Main Monitoring Loop ---
while true; do
  echo "$(date): Checking for new files in $MONITOR_DIR..." >> "$LOG_FILE"
  # Find new .txt files and process them
  for file in $(find "$MONITOR_DIR" -maxdepth 1 -type f -name "*.txt"); do
    if [ -f "$file" ]; then # Double-check if it's a regular file
      LINE_COUNT=$(wc -l < "$file")
      echo "$(date): Found '$file'. Lines: $LINE_COUNT." >> "$LOG_FILE"
      # Archiving will go here
    fi
  done
  sleep 5 # Check every 5 seconds
done

Архивирование обработанных файлов

После обработки файла нам нужно переместить его в каталог архива. Для этого используется команда mv. Мы также добавим оператор if, чтобы проверить код завершения mv, убедиться в успешности перемещения и записать сведения обо всех сбоях.

Это повышает надёжность нашего скрипта.

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

# --- Main Monitoring Loop ---
while true; do
  echo "$(date): Checking for new files in $MONITOR_DIR..." >> "$LOG_FILE"
  for file in $(find "$MONITOR_DIR" -maxdepth 1 -type f -name "*.txt"); do
    if [ -f "$file" ]; then
      LINE_COUNT=$(wc -l < "$file")
      echo "$(date): Found '$file'. Lines: $LINE_COUNT." >> "$LOG_FILE"
      
      mv "$file" "$ARCHIVE_DIR/"
      if [ $? -eq 0 ]; then
        echo "$(date): Moved '$file' to '$ARCHIVE_DIR'." >> "$LOG_FILE"
      else
        echo "$(date): ERROR: Failed to move '$file' to '$ARCHIVE_DIR'." >> "$LOG_FILE"
      fi
    fi
  done
  sleep 5
done

Корректное завершение с помощью trap

Долго работающему скрипту нужен способ корректно остановиться. Команда trap позволяет перехватывать сигналы, например SIGINT (подаваемый при нажатии Ctrl+C), и выполнять функцию очистки перед завершением. Это гарантирует, что скрипт запишет сведения о своём завершении.

Это важный шаг при создании скриптов, готовых к использованию в рабочей среде.

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# --- Functions ---
cleanup() {
  echo "$(date): Script received stop signal. Exiting gracefully." >> "$LOG_FILE"
  exit 0 # Exit with success status
}

# --- Trap Signals ---
# Trap SIGINT (Ctrl+C) and call the cleanup function
trap cleanup SIGINT

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

# --- Main Monitoring Loop ---
while true; do
  echo "$(date): Checking for new files in $MONITOR_DIR..." >> "$LOG_FILE"
  for file in $(find "$MONITOR_DIR" -maxdepth 1 -type f -name "*.txt"); do
    if [ -f "$file" ]; then
      LINE_COUNT=$(wc -l < "$file")
      echo "$(date): Found '$file'. Lines: $LINE_COUNT." >> "$LOG_FILE"
      
      mv "$file" "$ARCHIVE_DIR/"
      if [ $? -eq 0 ]; then
        echo "$(date): Moved '$file' to '$ARCHIVE_DIR'." >> "$LOG_FILE"
      else
        echo "$(date): ERROR: Failed to move '$file' to '$ARCHIVE_DIR'." >> "$LOG_FILE"
      fi
    fi
  done
  sleep 5
done

Тестирование расширенного скрипта

Теперь, когда наш скрипт завершён, пора его протестировать! Обычно его запускают в фоновом режиме (например, ./monitor.sh &), затем создают тестовые файлы в каталоге $MONITOR_DIR и наблюдают за $LOG_FILE и $ARCHIVE_DIR.

Вот небольшой скрипт, который можно запустить для удобного создания тестового файла для нашего средства мониторинга.

#!/bin/bash
# create_test_file.sh

MONITOR_DIR="/tmp/coddykit_monitor"
mkdir -p "$MONITOR_DIR" # Ensure dir exists for this test script

# Create a unique test file
TEST_FILE="$MONITOR_DIR/test_log_$(date +%Y%m%d_%H%M%S).txt"
echo "This is a test entry." > "$TEST_FILE"
echo "Another line for testing." >> "$TEST_FILE"
echo "Created new test file: $TEST_FILE"

Проверка логики скрипта

Наш расширенный скрипт объединяет множество концепций. Давайте кратко рассмотрим некоторые основные команды и конструкции, которые мы использовали.

Подумайте о роли каждой команды в достижении цели проекта.

Дальнейшие возможности: планирование и настройка

Этот скрипт рассчитан на непрерывную работу. В реальном сценарии его можно запустить в фоновом режиме с помощью nohup ./script.sh & или, что встречается чаще, настроить его периодический запуск с помощью Cron.

Помните: Cron отлично подходит для автоматизации подобных задач. Можно настроить запуск каждые несколько минут, чтобы скрипт проверял каталог и при необходимости обрабатывал файлы.

Попробуйте настроить скрипт для выполнения следующих задач:

  • Обрабатывать файлы других типов.
  • Выполнять другие действия (например, сжимать файлы или загружать их в облако).
  • Добавить более подробное информирование об ошибках (например, оповещения по электронной почте).

Итоги проекта и следующие шаги

Поздравляем! Вы завершили продвинутый проект по написанию скриптов Bash, объединив широкий набор команд Linux и методов написания скриптов.

Вы научились:

  • Структурировать надёжный скрипт, работающий длительное время.
  • Использовать переменные для настройки.
  • Реализовывать циклы для непрерывного мониторинга.
  • Объединять такие команды, как find, wc и mv.
  • Добавлять обработку ошибок и корректное завершение с помощью trap.

Этот проект даёт прочную основу для создания более сложных решений автоматизации. Продолжайте экспериментировать и создавать новые проекты!

Часто задаваемые вопросы

Урок «Проект по расширенной разработке скриптов» бесплатный?

Да — полный текст урока «Проект по расширенной разработке скриптов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс DevOps Bootcamp, подпишись на CoddyKit PRO. Курс DevOps Bootcamp содержит 4 уроков всего.

Чему я научусь в уроке «Проект по расширенной разработке скриптов»?

Выполните комплексный проект, объединяющий все изученные концепции: от инструментов командной строки до продвинутых приёмов написания скриптов Bash. Ты практикуешь DevOps Bootcamp с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать DevOps Bootcamp?

Предыдущий опыт не требуется. DevOps Bootcamp на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Проект по расширенной разработке скриптов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке DevOps Bootcamp?

Да. Каждый урок DevOps Bootcamp включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Планирование задач с Cron
  2. Автоматизация системного администрирования
  3. Проект по расширенной разработке скриптов
  4. Автоматическая ротация и очистка журналов
← Назад к DevOps Bootcamp