TGViewer
Bash Советы Bash Советы @bash_srv · 2.73K subscribers
Post #242 825
🔥 Предупреждение о переполнении дисков + топ “пожирателей” места

Данный ниже скрипт проверит заполнение всех ФС (кроме tmpfs/devtmpfs/squashfs/overlay), и если порог превышен - пришлёт сводку с ТОП директориями по размеру. Поддерживает уведомления в Telegram (через Bot API) или просто вывод в консоль.



Функционал

✅ Проверяет все реальные файловые системы
✅ Порог заполнения настраивается (THRESHOLD, по умолчанию 85%)
✅ Показывает TOP-N самых “тяжёлых” директорий на проблемном разделе (TOPN, по умолчанию 5)
✅ Исключения по mountpoint через EXCLUDE_REGEX (например, Docker)
✅ Уведомления в Telegram, если задать TELEGRAM_BOT_TOKEN и TELEGRAM_CHAT_ID




#!/usr/bin/env bash
# автор: https://t.me/bash_srv
set -Eeuo pipefail

# Настройки (можно переопределять переменными окружения)
THRESHOLD="${THRESHOLD:-85}" # % использования ФС, начиная с которого тревожим
TOPN="${TOPN:-5}" # сколько топ-директорий показать
EXCLUDE_REGEX="${EXCLUDE_REGEX:-^(/sys|/proc|/run|/snap|/var/lib/docker|/var/lib/containers)}"

# Исключаем псевдо-ФС
DF_TYPES=(-x tmpfs -x devtmpfs -x squashfs -x overlay)

notify() {
local msg="$1"
if [[ -n "${TELEGRAM_BOT_TOKEN:-}" && -n "${TELEGRAM_CHAT_ID:-}" ]]; then
curl -sS -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-d "chat_id=${TELEGRAM_CHAT_ID}" \
--data-urlencode "text=${msg}" >/dev/null || true
else
echo "$msg"
fi
}

alerts=()

# Читаем: <mountpoint> <use%>
while read -r mnt use; do
[[ "$mnt" =~ $EXCLUDE_REGEX ]] && continue
use="${use%\%}"
if (( use >= THRESHOLD )); then
# du в мегабайтах по границам ФС (-x), глубина 1, сортировка по размеру
top=$(du -x -m --max-depth=1 "$mnt" 2>/dev/null | sort -nr | head -n "$TOPN" \
| awk '{printf " %6d MB %s\n",$1,$2}')
alerts+=("⚠️ ФС $mnt занята на ${use}%%. Топ ${TOPN} директорий:\n${top}")
fi
done < <(df -P "${DF_TYPES[@]}" | awk 'NR>1{print $(NF), $(NF-1)}')

if ((${#alerts[@]})); then
host=$(hostname -f 2>/dev/null || hostname)
ts=$(date '+%F %T %Z')
msg="🚨 Диск почти заполнен: ${host}\n${ts}\nПорог: ${THRESHOLD}%%\n\n$(printf "%s\n\n" "${alerts[@]}")"
notify "$msg"
else
echo "✅ Все файловые системы ниже ${THRESHOLD}%."
fi



Установка


sudo install -m 0755 df_guard.sh /usr/local/bin/df_guard.sh


Примеры запуска

- Раз в 15 минут, тревожим после 90%, показываем TOP-3 и шлём в Telegram:


# В crontab (root)
*/15 * * * * THRESHOLD=90 TOPN=3 TELEGRAM_BOT_TOKEN=123:ABC TELEGRAM_CHAT_ID=123456 \
nice -n 10 ionice -c3 /usr/local/bin/df_guard.sh


- Исключаем Docker и снапшоты:


EXCLUDE_REGEX='^(/var/lib/docker|/mnt/snapshots)' df_guard.sh



- Для больших ФС du может крутиться дольше - добавьте nice/ionice, как в примере.
- Хотите человеческие единицы? Замените -m на -h и уберите выравнивание в awk.
- Если сервер за NAT/без выхода в интернет - уведомления уйдут в stdout и попадут в системную почту cron.

📲 Мы в MAX

👉@bash_srv
  • 👍 4
  • 🔥 1
More from @bash_srv
  1. Sep 21, 2026💡 Bash-совет: Анализ самых активных IP в логах веб-сервера 🐚🚀 Когда на сервере много тр…
  2. Sep 16, 2026Сегодня я хочу поделиться простым, но очень полезным Bash-скриптом для автоматического рез…
  3. Sep 14, 2026🕵️‍♂️ Мониторим новые файлы в каталоге в реальном времени Иногда нужно узнать, когда в оп…
  4. Sep 11, 2026🧹 Bash-скрипт для очистки старых логов с уведомлением Иногда логи занимают слишком много…
  5. Sep 8, 2026🚀 Мониторим активные подключения к серверу по SSH Иногда нужно быстро узнать, кто сейчас…
  6. Sep 7, 2026🚀 Полезный Bash-скрипт для архивации старых логов 🚀 Иногда логи на сервере растут быстре…
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 →