tgoop.com/bash_srv/85
Create:
Last Update:
Last Update:
📈 Мониторинг загрузки CPU и памяти с автоматическими уведомлениями 🚨Часть 1️⃣
Всем привет! Сегодня сделаем Bash-скрипт, который периодически проверяет загрузку процессора и использование памяти, логирует результаты и отправляет уведомление, если показатели превышают заданные пороги. Полезно держать под контролем ресурсы сервера и вовремя реагировать на перегрузки.
#!/usr/bin/env bash
# Название: monitor_resources.sh
# Описание: Мониторит загрузку CPU и память, пишет в лог и уведомляет при превышении порогов.
# Использование: ./monitor_resources.sh 75 80 "/путь/до/notify.sh" "/var/log/resource_monitor.log"
# ---------------------------
# Параметры:
# $1 - порог нагрузки CPU в % (например, 75)
# $2 - порог использования RAM в % (например, 80)
# $3 - (опционально) скрипт для уведомления (при превышении любого порога)
# $4 - (опционально) файл лога (по умолчанию /var/log/resource_monitor.log)
# ---------------------------
CPU_THRESHOLD="${1:-75}"
RAM_THRESHOLD="${2:-80}"
NOTIFY_SCRIPT="$3"
LOG_FILE="${4:-/var/log/resource_monitor.log}"
# Функция: Получает текущую загрузку CPU в процентах (суммарно по всем ядрам)
get_cpu_usage() {
# Используем команду top в batch-режиме один раз, парсим строку "%Cpu(s)"
local cpu_idle
cpu_idle=$(top -bn1 | grep '^%Cpu' | awk '{print $8}' | tr -d ',%i')
# cpu_idle — процент простаивающего CPU, остальное считается занятостью
local cpu_usage=$((100 - cpu_idle))
echo "$cpu_usage"
}
# Функция: Получает текущее использование RAM в процентах
get_ram_usage() {
# Используем команду free, берем строку Mem:, вычисляем (used/total)*100
local total mem_free buff_cache used
read -r total mem_free buff_cache used _ < <(free -m | awk '/^Mem:/ {print $2, $4, $6, $3}')
# Общее доступное для процессов = free + buff/cache
local available=$((mem_free + buff_cache))
local ram_usage=$(( ( (total - available) * 100 ) / total ))
echo "$ram_usage"
}
# Функция: Записывает в лог текущие показатели с датой и временем
write_log() {
local timestamp
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$timestamp] CPU: ${CPU}% | RAM: ${RAM}%" >> "$LOG_FILE"
}
# Функция: Проверяет пороги и при необходимости вызывает скрипт уведомления
check_thresholds() {
local alert_messages=()
if (( CPU > CPU_THRESHOLD )); then
alert_messages+=("CPU превышен: текущая загрузка ${CPU}% (порог ${CPU_THRESHOLD}%)")
fi
if (( RAM > RAM_THRESHOLD )); then
alert_messages+=("RAM превышен: текущее использование ${RAM}% (порог ${RAM_THRESHOLD}%)")
fi
if [[ ${#alert_messages[@]} -gt 0 ]]; then
local full_message="🚨 WARNING на $(hostname):\n$(printf '%s\n' "${alert_messages[@]}")"
echo -e "$full_message" >> "$LOG_FILE"
if [[ -x "$NOTIFY_SCRIPT" ]]; then
# Передаем уведомление как один аргумент (с переводами строк)
"$NOTIFY_SCRIPT" "$full_message"
echo "✔️ Уведомление отправлено через $NOTIFY_SCRIPT" >> "$LOG_FILE"
else
echo "⚠️ Скрипт уведомления не доступен или не указан." >> "$LOG_FILE"
fi
fi
}
# Основной блок
CPU=$(get_cpu_usage)
RAM=$(get_ram_usage)
write_log
check_thresholds
exit 0
Как это работает 📋
1. get_cpu_usage
*
top -bn1 запускает top в неинтерактивном режиме один раз (batch mode).* Парсим строку вида
%Cpu(s): 3.0 us, 1.0 sy, 0.0 ni, 95.5 id, ... и берем поле с процентом простаивающего CPU (id).*
cpu_usage = 100 - cpu_idle — получаем загрузку в процентах.2. get_ram_usage
*
free -m выводит статистику по памяти в мегабайтах. Строка Mem: содержит total, used, free, shared, buff/cache, available.* Чтобы учесть буфер/кэш, вычисляем
available = free + buff/cache.*
ram_usage = ((total - available) * 100) / total — процент реально занятой памяти.3. Запись в лог
* В файл (по умолчанию
/var/log/resource_monitor.log) пишется строка с текущими значениями CPU и RAM вместе с временной меткой.* Если файл не существует, он будет создан автоматически (не забудьте, чтобы скрипт имел права записи в эту директорию).
Продолжение в след. посте
👇
👉@bash_srvBY Bash Советы
Share with your friend now:
tgoop.com/bash_srv/85
