Цель урока: Продолжить работу над нашим скриптом 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}'
}

Разбор изменений:

  1. printf "..." "доступно": Мы добавили новый заголовок для нашей таблицы.

  2. ... $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}'
}

Разбор мощных улучшений:

  1. df -hT: Мы сразу запрашиваем тип файловой системы, он нам понадобится.

  2. grep -vE 'tmpfs|squashfs': Это наш новый, профессиональный фильтр.

    • grep -v: Инвертировать, то есть, показать строки, которые НЕ соответствуют шаблону.

    • grep -E: Включить расширенные регулярные выражения. Это позволяет нам использовать | как логическое "ИЛИ".

    • 'tmpfs|squashfs': Шаблон, который означает "строка содержит tmpfs ИЛИ squashfs".

    • Итог: команда отбрасывает все временные файловые системы и файловые системы snap-пакетов, оставляя только "настоящие" диски.

  3. awk 'NR>1 {...}'NR - это номер текущей строки. NR>1 - это условие, которое означает "выполнить действие для всех строк, кроме первой". Зачем? Чтобы отбросить строку-заголовок от самой команды df (Filesystem Type Size ...).

Часть 4: Тестирование и результат

Шаг 1: Сохранение и запуск

  1. Убедитесь, что вы внесли изменения в обе функции.

  2. В nano сохраните файл (Ctrl+OEnter) и выйдите (Ctrl+X).

  3. Запустите скрипт:

    ./system_audit.sh

Ожидаемый результат:
Ваш отчет стал еще более профессиональным! Таблица памяти теперь содержит критически важный столбец "доступно", а таблица дисков показывает только реальные разделы, без системного мусора, и включает тип файловой системы.

Часть 5: Заключение

Сегодня мы не просто написали код, мы улучшили его, основываясь на реальных сценариях и потенциальных проблемах. Вы научились:

  • Делать скрипты более надежными, проверяя наличие необходимых утилит.

  • Собирать более точную и современную информацию о памяти (available RAM).

  • Использовать продвинутые фильтры grep, чтобы очищать вывод от ненужной информации и делать отчеты более чистыми.

На следующем, 33-м уроке, мы завершим сбор данных для нашего скрипта. Мы напишем код для последней функции - get_network_info, где научимся не только извлекать IP-адреса, но и выводить список открытых портов, используя команду ss.

Перейти к просмотру - УРОК №33.

подарок Промо-код: PROMO15 - скидка 15%! огонь

Введите при оформлении первого заказа на сайте: Hosting-VDS.com

авторское право цифровые решения

Помог ли вам данный ответ? 0 Пользователи нашли это полезным (0 голосов)