Вопрос или проблема
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 <
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
Проверяйте и тестируйте этот скрипт на вашей системе. Убедитесь, что использованные команды и переменные корректны и легко читаемы. Правильный мониторинг ресурсов поможет вам поддерживать производительность вашей системы и своевременно реагировать на потенциальные проблемы.