(Солярис) Скрипт мониторинга CPU Ram неправильно получает значения использования оперативной памяти CPU.

Вопрос или проблема

host=$(hostname)
email=”[email protected]” # Измените на нужный вам email
subject=”Внимание!!! Проверка работоспособности не удалась на $host”
echo $(date)

# Порог использования CPU
cpu_threshold=0

# Порог свободной памяти
mem_threshold=0

#— CPU
cpu_usage () {
# Получить процент простоя CPU
cpu_idle=$(prstat -Z 1 1 | awk ‘NR==2 {print $8}’ | tr -d ‘%’)

# Проверить, является ли cpu_idle допустимым числом
if ! [[ “$cpu_idle” =~ ^[0-9]+$ ]]; then
echo “Ошибка: Неверное значение простоя CPU: $cpu_idle”
cpu_use=0
else
cpu_use=$((100 – cpu_idle))
fi

cpu_flag=0
echo “Использование CPU: $cpu_use%”
if [ “$cpu_use” -gt “$cpu_threshold” ]; then
echo “Предупреждение CPU!!!”
cpu_flag=1
else
echo “CPU в порядке!!!”
fi
}

#— Память
mem_usage () {
mem_total=$(kstat -m | grep “physmem” | awk ‘{print $2}’) # Общая память в байтах
mem_free=$(kstat -m | grep “freemem” | awk ‘{print $2}’) # Свободная память в байтах

if [[ -z “$mem_total” || “$mem_total” -eq 0 ]]; then
echo “Не удалось получить общую память.”
mem_total=0
mem_free=0
fi

# Преобразование байтов в ГБ
mem_total_gb=$((mem_total / 1024 / 1024))
mem_free_gb=$((mem_free / 1024 / 1024))

echo “Общая память: $mem_total_gb ГБ”
echo “Свободная память: $mem_free_gb ГБ”

if [ “$mem_total” -gt 0 ]; then
per_mem=$(( ((mem_total – mem_free)) * 100 / mem_total ))
else
per_mem=0
fi

echo “Осталось свободного пространства памяти: $mem_free_gb ГБ”
mem_flag=0
if [ “$per_mem” -gt “$mem_threshold” ]; then
echo “Предупреждение по памяти!!!”
mem_flag=1
else
echo “Память в порядке!!!”
fi
}

out() {
if [ “$cpu_flag” -eq 1 ] && [ “$mem_flag” -eq 1 ]; then
printf ”
Здравствуйте, команда,

Пожалуйста, проверьте использование RAM и CPU на $host.
Текущий процент RAM: $per_mem%%
Текущий процент CPU: $cpu_use%%

Спасибо ” > /tmp/health.txt
elif [ “$cpu_flag” -eq 1 ]; then
printf ”
Здравствуйте, команда,

Пожалуйста, проверьте использование CPU на $host.
Текущий процент CPU: $cpu_use%%

Спасибо ” > /tmp/health.txt
elif [ “$mem_flag” -eq 1 ]; then
printf ”
Здравствуйте, команда,

Пожалуйста, проверьте использование RAM на $host.
Текущий процент RAM: $per_mem%%

Спасибо ” > /tmp/health.txt
fi
}

mail() {
if [ “$cpu_flag” -eq 1 ] || [ “$mem_flag” -eq 1 ]; then
/usr/sbin/sendmail -t <[email protected]
To: $email

$(cat /tmp/health.txt)
EOF
fi
}

# Выполняем функции
cpu_usage
mem_usage
out
mail

Пятн, 11 октября 06:51:21 CDT 2024
Ошибка: Неверное значение простоя CPU: 17:25:22
Использование CPU: 0%
CPU в порядке!!!
Использование:
kstat [ -qlp ] [ -T d|u ] [ -c class ]
      [ -m module ] [ -i instance ] [ -n name ] [ -s statistic ]
      [ интервал [ счет ] ]
kstat [ -qlp ] [ -T d|u ] [ -c class ]
      [ module:instance:name:statistic ... ]
      [ интервал [ счет ] ]
Использование:
kstat [ -qlp ] [ -T d|u ] [ -c class ]
      [ -m module ] [ -i instance ] [ -n name ] [ -s statistic ]
      [ интервал [ счет ] ]
kstat [ -qlp ] [ -T d|u ] [ -c class ]
      [ module:instance:name:statistic ... ]
      [ интервал [ счет ] ]
Не удалось получить общую память.
Общая память: 0 ГБ
Свободная память: 0 ГБ
Осталось свободного пространства памяти: 0 ГБ
Память в порядке!!!

В строке параметр CPU 9-й:

cpu_idle=$(prstat -Z 1 1 | awk 'NR==2 {print $9}' | tr -d '%')

Но эта команда не даст вам время простоя. Она даст время CPU первого процесса в списке. Лучше используйте команду:

vmstat 1 2|nawk 'NR==4 {print $NF}'

Команды kstat можно переписать следующим образом:

mem_total=$(kstat |  nawk '/physmem/ {print $2}')
mem_free=$(kstat | nawk '/freemem/ {print $2}') 

P.S. Используйте nawk, оригинальный Solaris awk имеет некоторые особенности, с которыми вы не хотите бороться.


Ответ или решение

Для мониторинга использования CPU и RAM на платформе Solaris с помощью скрипта, прежде всего важно правильно извлекать данные о потреблении ресурсов. Судя по вашему описанию, основная проблема заключается в неправильном считывании значений, связанных с использованием памяти, а также в неправильном использовании команды для получения загрузки CPU. Давайте подробно рассмотрим обе проблемы и предложим решения.

1. Проблема с получением информации о загрузке CPU

В вашем изначальном скрипте вы используете команду prstat для получения значения idle CPU как:

cpu_idle=$(prstat -Z 1 1 | awk 'NR==2 {print $8}' | tr -d '%')

Однако, как вы уже отметили, это неверная логика, так как команда prstat фактически возвращает информацию о первом процессе в списке. Вместо этого рекомендуется использовать vmstat, который более подходит для мониторинга состояния CPU. Используйте следующую команду:

cpu_idle=$(vmstat 1 2 | nawk 'NR==4 {print $NF}')

Этот подход даст вам правильный процент неактивных CPU ядер, с которого вы можете вычислить использование CPU.

2. Проблема с получением информации о памяти

Ваша попытка получить данные по памяти с помощью kstat была также неудачной:

mem_total=$(kstat -m | grep "physmem" | awk '{print $2}')  # Total memory in bytes
mem_free=$(kstat -m | grep "freemem" | awk '{print $2}')   # Free memory in bytes

Следует использовать другую версию этой команды, чтобы корректно считывать значения. Измените на:

mem_total=$(kstat | nawk '/physmem/ {print $2}')
mem_free=$(kstat | nawk '/freemem/ {print $2}')

Это обеспечит корректное извлечение значения общей и свободной памяти.

3. Обработка ошибок и вывод сообщений

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

if [ -z "$mem_total" ] || [ "$mem_total" -eq 0 ]; then
    echo "Ошибка: не удалось получить значение общей памяти."
    exit 1  # Или любой другой код ошибки
fi

4. Заключение

Убедитесь, что вы используете nawk вместо обычного awk, так как он имеет некоторые специфические свойства и поведение, которые могут лучше подходить для Solaris.

Вот финальный пример исправленного скрипта для мониторинга CPU и RAM:

#!/bin/bash

host=$(hostname)
email="your_email@example.com"  # Замените на ваш адрес электронной почты
subject="Ошибка здоровья на $host"
date

# Установите пороги
cpu_threshold=0
mem_threshold=0

# Функция для мониторинга CPU
cpu_usage () {
    cpu_idle=$(vmstat 1 2 | nawk 'NR==4 {print $NF}')
    if ! [[ "$cpu_idle" =~ ^[0-9]+$ ]]; then
        echo "Ошибка: недействительное значение idle CPU: $cpu_idle"
        cpu_use=0
    else
        cpu_use=$((100 - cpu_idle))
    fi

    echo "Использование CPU: $cpu_use%"
}

# Функция для мониторинга памяти
mem_usage () {
    mem_total=$(kstat | nawk '/physmem/ {print $2}')
    mem_free=$(kstat | nawk '/freemem/ {print $2}')

    if [ -z "$mem_total" ] || [ "$mem_total" -eq 0 ]; then
        echo "Ошибка: не удалось получить значение общей памяти."
        mem_total=0
        mem_free=0
    fi

    mem_total_gb=$((mem_total / 1024 / 1024))
    mem_free_gb=$((mem_free / 1024 / 1024))

    if [ "$mem_total" -gt 0 ]; then
        per_mem=$(( ((mem_total - mem_free)) * 100 / mem_total ))
    else
        per_mem=0
    fi

    echo "Использование памяти: $per_mem%"
}

# Вызов функций
cpu_usage
mem_usage

Проверяйте и тестируйте этот скрипт на вашей системе. Убедитесь, что использованные команды и переменные корректны и легко читаемы. Правильный мониторинг ресурсов поможет вам поддерживать производительность вашей системы и своевременно реагировать на потенциальные проблемы.

Оцените материал
Добавить комментарий

Капча загружается...