Проект по расширенной разработке скриптов
Выполните комплексный проект, объединяющий все изученные концепции: от инструментов командной строки до продвинутых приёмов написания скриптов Bash.
«Проект по расширенной разработке скриптов» — бесплатный урок Linux Command Line & Bash Scripting Mastery на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Linux Command Line & Bash Scripting Mastery, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Linux Command Line & Bash Scripting Mastery содержит 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) и разблокировать остальной курс Linux Command Line & Bash Scripting Mastery, подпишись на CoddyKit PRO. Курс Linux Command Line & Bash Scripting Mastery содержит 4 уроков всего.
Чему я научусь в уроке «Проект по расширенной разработке скриптов»?
Выполните комплексный проект, объединяющий все изученные концепции: от инструментов командной строки до продвинутых приёмов написания скриптов Bash. Ты практикуешь Linux Command Line & Bash Scripting Mastery с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Linux Command Line & Bash Scripting Mastery?
Предыдущий опыт не требуется. Linux Command Line & Bash Scripting Mastery на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Проект по расширенной разработке скриптов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Linux Command Line & Bash Scripting Mastery?
Да. Каждый урок Linux Command Line & Bash Scripting Mastery включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Планирование задач с Cron
- Автоматизация системного администрирования
- Проект по расширенной разработке скриптов
- Автоматическая ротация и очистка журналов