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

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

⚡ Суть теории

  • Задача 1: мониторинг диска — df / | awk '{print $5}' | sed 's/%//', порог 70%, поиск больших файлов через du -ah | sort -rh | head -n 10
  • Задача 2: системный отчёт — версия ОС, дата, uptime -p, нагрузка, топ процессов, who | wc -l
  • Задача 3: cron-бекап 0 2 * * 0 + find -mtime +21 -delete
  • Задача 4: анализ логов с grep -E -r + uniq -c | sort -nr
Что такое скрипт
Скрипт — это небольшая программа, которая содержит последовательность действий, созданных для автоматического выполнения задачи.

Задача 1 — Мониторинг дискового пространства

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

Алгоритм

  1. Получить процент занятого пространства корневого раздела через df /.
  2. Выделить число с помощью awk '{print $5}' (5-я колонка — Use%).
  3. Убрать знак % командой sed 's/%//'.
  4. Сравнить с порогом: [ "$disk_usage" -gt "$threshold" ].
  5. Если превышен — найти 10 самых больших объектов: du -ah / | sort -rh | head -n 10.

Ключевые команды

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

# Сравнение с порогом
if [ "$disk_usage" -gt "$threshold" ]; then
    echo "Disk usage exceeds threshold"
fi

# Найти самые большие объекты
du -ah / | sort -rh | head -n 10

Задача 2 — Системный отчёт

Создать скрипт, который готовит отчёт о системе: версия ОС, дата и время, время работы, загруженность, дисковое пространство, топ процессов, количество пользователей.

Новые команды

uptime (вводится в этом уроке)
Показывает время работы системы, количество пользователей и среднюю нагрузку.
uptime -p — вывод в читаемом формате: up 2 hours, 15 minutes
uptime | awk -F'[a-z]:' '{ print $2 }' — извлечь только данные о нагрузке
who (вводится в этом уроке)
Показывает список авторизованных пользователей.
who | wc -l — подсчитать количество активных пользователей

Алгоритм

# Версия операционной системы
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/%//')

# Топ процессы по использованию памяти (первые 6 строк = заголовок + 5 процессов)
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)

Объяснение флагов ps

  • -e — все процессы (эквивалент -A)
  • -o pid,ppid,cmd,%mem,%cpu — выбрать конкретные поля для вывода
  • --sort=-%mem — сортировка по убыванию использования памяти
  • head -n 6 — первые 6 строк (заголовок + 5 самых «тяжёлых» процессов)

Задача 3 — Cron-бекап

Создать задание, которое раз в неделю (каждую неделю в воскресенье в 2 часа ночи) бекапит /opt и /home/ec2-user, создавая архивы. Хранить не более 3 копий.

Расписание cron

# Каждую неделю в воскресенье в 2:00 ночи
0 2 * * 0 /полный/путь/к/backup_script.sh >> /полный/путь/к/backup.log 2>&1
#| | | | |
#| | | | день недели: 0 = воскресенье
#| | | месяц: * = любой
#| | день месяца: * = любой
#| час: 2 = 2:00 ночи
#минуты: 0

Логика ротации архивов

Задание выполняется раз в неделю. Чтобы хранить не более 3 копий — удалять архивы старше 21 дня (3 недели × 7 дней):

# Удалить архивы старше 21 дня
find "$backup_location" -maxdepth 1 -type f -name "*.tar.gz" -mtime +21 -delete
⚠️ Предупреждение: find … -delete
Флаг -delete безвозвратно удаляет файлы. Перед запуском обязательно проверьте правильность переменной $backup_location и значение -mtime. Для проверки без удаления замените -delete на -print.

Параметры скрипта

backup_dirs=("/opt" "/home/ec2-user")
backup_location="/backup"
max_backup_count=3

Задача 4 — Мониторинг логов

Создать скрипт, который проверяет наличие ошибок в логах директории /var/log и готовит отчёт об их количестве и самых частых ошибках.

Шаблон для поиска ошибок

# Шаблон: искать error/Error/ERROR/warning/Warning/WARNING
error_patterns="(error|Error|ERROR|warning|Warning|WARNING)"

Алгоритм

  1. Рекурсивно искать по шаблону в директории: grep -E -r "$error_patterns" "$log_directory"
  2. Выделить только текст ошибки: awk -F ':' '{print $2}'
  3. Отсортировать строки: sort
  4. Посчитать уникальные + отсортировать по частоте: uniq -c | sort -nr
# Поиск и подсчёт ошибок
grep -E -r "$error_patterns" "$log_directory" \
  | awk -F ':' '{print $2}' \
  | sort \
  | uniq -c \
  | sort -nr > "$report_file"

# Топ-5 ошибок
head -n 5 "$report_file"

Объяснение флагов

  • grep -E — расширенные регулярные выражения (ERE)
  • grep -r — рекурсивный поиск по поддиректориям
  • uniq -c — подсчитать количество одинаковых строк (нужна предварительная сортировка)
  • sort -nr — числовая сортировка в порядке убывания