
Цель урока: Продолжить работу над нашим скриптом system_audit.sh. Сегодня мы напишем код для двух ключевых функций: get_memory_info и get_disk_info. Мы будем использовать уже знакомые нам команды, но с профессиональными уточнениями, чтобы наш отчет был максимально точным, чистым и работал на разных системах.
Часть 1: Подготовка. Проверяем наличие инструментов
Прежде чем писать код, который использует внешние утилиты, хороший скрипт должен убедиться, что эти утилиты установлены. Для нашего отчета нам понадобится пакет lsb-release (для красивого имени дистрибутива).
Шаг 1: Добавляем проверку и установку пакетов (опционально, но рекомендуется)
Откройте ваш скрипт system_audit.sh и в самом верху, после "шапки", но перед объявлением функций, можно добавить блок для установки необходимых пакетов. Это сделает ваш скрипт более универсальным.
nano ~/scripts/system_audit.sh
Добавьте этот блок:
# --- ПРОВЕРКА И УСТАНОВКА НЕОБХОДИМЫХ ПАКЕТОВ ---
# Проверяем, что утилита lsb_release доступна
if ! command -v lsb_release &> /dev/null
then
echo "Утилита lsb_release не найдена. Устанавливаем пакет lsb-release..."
apt update > /dev/null && apt install -y lsb-release > /dev/null
fi
Разбор новой конструкции:
-
command -v lsb_release &> /dev/null: Эта команда проверяет, существует ли lsb_release. &> /dev/null перенаправляет и стандартный вывод, и ошибки в "черную дыру", чтобы на экране не было лишнего мусора.
-
if ! ...: ! инвертирует результат. То есть, "Если команда command -v завершилась с ошибкой (т.е. утилита не найдена)".
-
apt install -y: Ключ -y автоматически отвечает "yes" на вопрос об установке.
Часть 2: Практика. Реализация функции get_memory_info
Эта функция должна показывать информацию об использовании RAM и Swap. Мы сделаем ее более современной, добавив столбец "Доступно".
Шаг 1: Вспоминаем, как работает free
Команда free -h показывает память в удобном формате.
free -h
Результат (примерный):
total used free shared buff/cache available
Mem: 1.9Gi 250Mi 1.2Gi 1.0Mi 450Mi 1.5Gi
Swap: 1.0Gi 0B 1.0Gi
Столбец available (7-й столбец) - самый важный. Он показывает, сколько памяти реально доступно для запуска новых приложений, учитывая кэш, который система может легко освободить.
Шаг 2: Пишем код для функции
Найдите в nano функцию get_memory_info и замените ее код-"заглушку" на следующий:
# Функция для сбора информации о RAM
get_memory_info() {
print_header "3. Информация о RAM"
printf "%-15s %10s %10s %10s %10s\n" "" "всего" "исп." "своб." "доступно"
# Используем free -h, чтобы получить данные, и awk для форматирования
free -h | awk '/^Mem:/{printf "%-15s %10s %10s %10s %10s\n", "Память (RAM):", $2, $3, $4, $7}
/^Swap:/{printf "%-15s %10s %10s %10s\n", "Swap:", $2, $3, $4}'
}
Разбор изменений:
-
printf "..." "доступно": Мы добавили новый заголовок для нашей таблицы.
-
... $4, $7}: В строке для Mem: мы теперь выводим не только total($2), used($3) и free($4), но и available ($7). Это делает наш отчет гораздо более информативным.
Часть 3: Практика. Реализация функции get_disk_info
Эта функция должна показывать отчет об использовании дискового пространства. Здесь мы применим более надежный фильтр, чтобы избавиться от системного "мусора".
Шаг 1: Проблема с loop-устройствами
Если вы запустите df -h на современной Ubuntu, вы можете увидеть много строк вида /dev/loop0, /dev/loop1 и т.д. Это виртуальные устройства, создаваемые snap-пакетами. Они нам в отчете не нужны.
df -hT
Результат (примерный):
Filesystem Type Size Used Avail Use% Mounted on
/dev/vda1 ext4 25G 2.4G 22G 10% /
/dev/loop0 squashfs 64M 64M 0 100% /snap/core22/858
Простой grep '^/dev/' оставит и /dev/vda1, и /dev/loop0.
Шаг 2: Пишем код для функции с улучшенным фильтром
Найдите в nano функцию get_disk_info и замените ее код-"заглушку" на следующий:
# Функция для сбора информации о дисках
get_disk_info() {
print_header "4. Информация о дисковом пространстве"
printf "%-25s %-10s %-10s %-10s %-10s %-10s\n" "Файловая система" "Тип" "Размер" "Исп." "Дост." "Исп.%"
# Используем df -hT, исключаем ненужные типы ФС и форматируем вывод
df -hT | grep -vE 'tmpfs|squashfs' | awk 'NR>1 {printf "%-25s %-10s %-10s %-10s %-10s %-10s\n", $1, $2, $3, $4, $5, $6}'
}
Разбор мощных улучшений:
-
df -hT: Мы сразу запрашиваем тип файловой системы, он нам понадобится.
-
grep -vE 'tmpfs|squashfs': Это наш новый, профессиональный фильтр.
-
grep -v: Инвертировать, то есть, показать строки, которые НЕ соответствуют шаблону.
-
grep -E: Включить расширенные регулярные выражения. Это позволяет нам использовать | как логическое "ИЛИ".
-
'tmpfs|squashfs': Шаблон, который означает "строка содержит tmpfs ИЛИ squashfs".
-
Итог: команда отбрасывает все временные файловые системы и файловые системы snap-пакетов, оставляя только "настоящие" диски.
-
-
awk 'NR>1 {...}': NR - это номер текущей строки. NR>1 - это условие, которое означает "выполнить действие для всех строк, кроме первой". Зачем? Чтобы отбросить строку-заголовок от самой команды df (Filesystem Type Size ...).
Часть 4: Тестирование и результат
Шаг 1: Сохранение и запуск
-
Убедитесь, что вы внесли изменения в обе функции.
-
В nano сохраните файл (Ctrl+O, Enter) и выйдите (Ctrl+X).
-
Запустите скрипт:
./system_audit.sh
Ожидаемый результат:
Ваш отчет стал еще более профессиональным! Таблица памяти теперь содержит критически важный столбец "доступно", а таблица дисков показывает только реальные разделы, без системного мусора, и включает тип файловой системы.

Часть 5: Заключение
Сегодня мы не просто написали код, мы улучшили его, основываясь на реальных сценариях и потенциальных проблемах. Вы научились:
-
Делать скрипты более надежными, проверяя наличие необходимых утилит.
-
Собирать более точную и современную информацию о памяти (available RAM).
-
Использовать продвинутые фильтры grep, чтобы очищать вывод от ненужной информации и делать отчеты более чистыми.
На следующем, 33-м уроке, мы завершим сбор данных для нашего скрипта. Мы напишем код для последней функции - get_network_info, где научимся не только извлекать IP-адреса, но и выводить список открытых портов, используя команду ss.
Перейти к просмотру - УРОК №33.
Промо-код: PROMO15 - скидка 15%!
Введите при оформлении первого заказа на сайте: Hosting-VDS.com

