💻 Примеры — Продолжение работы со скриптами

К оглавлению урока

⚡ Быстрый запуск скриптов

chmod +x disk_monitor.sh && ./disk_monitor.sh
chmod +x system_report.sh && ./system_report.sh
chmod +x backup_script.sh && ./backup_script.sh
chmod +x log_monitor.sh && ./log_monitor.sh

Пример 1 — Мониторинг дискового пространства

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

# disk_monitor.sh

#!/bin/bash
# Пороговое значение для занятого дискового пространства (в процентах)
threshold=70

# Получаем процент занятого дискового пространства корневого раздела
disk_usage=$(df / | awk '{print $5}' | sed 's/%//')

if [ "$disk_usage" -gt "$threshold" ]; then
    echo "Disk usage exceeds $threshold% threshold. Searching for largest directories and files..."
    echo "Largest directories and files:"
    du -ah / | sort -rh | head -n 10
else
    echo "Disk usage on the root partition is $disk_usage% (within threshold of $threshold%)."
fi

Как запустить

chmod +x disk_monitor.sh
./disk_monitor.sh

Разбор ключевых строк

  • df / | awk '{print $5}' — получить 5-ю колонку (Use%) вывода df
  • sed 's/%//' — убрать символ %, чтобы осталось чистое число
  • [ "$disk_usage" -gt "$threshold" ] — числовое сравнение (greater than)
  • du -ah / | sort -rh | head -n 10 — найти 10 самых больших объектов в /

Пример 2 — Системный отчёт

Скрипт собирает полный отчёт о состоянии системы.

# system_report.sh

#!/bin/bash
# Версия операционной системы
os_version=$(cat /etc/os-release | grep "PRETTY_NAME" | cut -d '"' -f 2)

# Дата и время
current_date=$(date "+%Y-%m-%d")
current_time=$(date "+%H:%M:%S")

# Время работы системы
uptime_info=$(uptime -p)

# Загруженность системы
system_load=$(uptime | awk -F'[a-z]:' '{ print $2 }')

# Занятое дисковое пространство
disk_usage=$(df / | awk '{print $5}' | sed 's/%//')

# Топ процессы по использованию памяти
top_processes=$(ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -n 6)

# Количество процессов
process_count=$(ps -ef | wc -l)

# Количество пользователей
user_count=$(who | wc -l)

# Выводим отчет
echo "System Report"
echo "OS Version: $os_version"
echo "Date: $current_date"
echo "Time: $current_time"
echo "System Uptime: $uptime_info"
echo "System Load: $system_load"
echo "Disk Usage: $disk_usage%"
echo "Top processes by memory usage:"
echo "$top_processes"
echo "Number of processes: $process_count"
echo "Number of logged-in users: $user_count"

Ключевые моменты

  • uptime -p — удобный вывод: «up 2 hours, 15 minutes»
  • uptime | awk -F'[a-z]:' '{ print $2 }' — разделитель = любая строчная буква + двоеточие; $2 — то, что идёт после «load average:»
  • ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -n 6 — заголовок + 5 процессов
  • who | wc -l — количество строк = количество вошедших пользователей

Пример 3 — Cron-бекап с ротацией архивов

⚠️ Предупреждение: find … -mtime +21 -delete
Эта команда безвозвратно удаляет файлы. Перед первым запуском проверьте корректность переменной $backup_location и замените -delete на -print для тестового прогона.

# backup_script.sh

#!/bin/bash
# Директории для резервного копирования
backup_dirs=("/opt" "/home/ec2-user")

# Директория для хранения архивов
backup_location="/backup"

# Максимальное количество хранимых архивов
max_backup_count=3

# Создаём каталог для хранения бекапов, если он не существует
mkdir -p "$backup_location"

# Проходимся по каждой директории и создаём архив
for dir in "${backup_dirs[@]}"; do
    backup_file="$backup_location/$(basename "$dir")_backup_$(date +%Y-%m-%d).tar.gz"
    tar -czf "$backup_file" "$dir"
done

# Удаляем старые архивы
# Задание выполняется раз в неделю, поэтому -mtime +21 = старше 3 недель
find "$backup_location" -maxdepth 1 -type f -name "*.tar.gz" -mtime +21 -delete

Настройка cron

crontab -e
# Добавить строку (еженедельно в воскресенье в 2:00):
0 2 * * 0 /home/ec2-user/backup_script.sh >> /home/ec2-user/backup.log 2>&1

Пример 4 — Мониторинг ошибок в логах

# log_monitor.sh

#!/bin/bash
# Директория с логами
log_directory="/var/log"

# Файл для сохранения отчёта
report_file="/tmp/error_report.txt"

# Шаблон для поиска ошибок
error_patterns="(error|Error|ERROR|warning|Warning|WARNING)"

# Поиск ошибок в логах и подсчёт их количества
grep -E -r "$error_patterns" "$log_directory" \
    | awk -F ':' '{print $2}' \
    | sort \
    | uniq -c \
    | sort -nr > "$report_file"

# Вывод отчёта в консоль
echo "Error report for logs in $log_directory:"
cat "$report_file"

# Топ-5 наиболее частых ошибок
echo ""
echo "Top 5 most frequent errors:"
head -n 5 "$report_file"

Как запустить

chmod +x log_monitor.sh
./log_monitor.sh