TGViewer
Bash Советы Bash Советы @bash_srv · 2.73K subscribers
Post #85 1.28K
📈 Мониторинг загрузки 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_srv
  • 👍 8
  • 👎 1
More from @bash_srv
  1. Sep 29, 2026Bash-совет: анализ неудачных SSH-логинов и бан «горячих» IP 🔒🐚 Хотите быстро узнать, как…
  2. Sep 21, 2026💡 Bash-совет: Анализ самых активных IP в логах веб-сервера 🐚🚀 Когда на сервере много тр…
  3. Sep 16, 2026Сегодня я хочу поделиться простым, но очень полезным Bash-скриптом для автоматического рез…
  4. Sep 14, 2026🕵️‍♂️ Мониторим новые файлы в каталоге в реальном времени Иногда нужно узнать, когда в оп…
  5. Sep 11, 2026🧹 Bash-скрипт для очистки старых логов с уведомлением Иногда логи занимают слишком много…
  6. Sep 8, 2026🚀 Мониторим активные подключения к серверу по SSH Иногда нужно быстро узнать, кто сейчас…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →