Bash Советы - Bash Scripting | Linux Terminal & Shell. Скрипты и Автоматизация задач. Командная строка для Sysadmin и DevOps. Уроки Баш, Zsh и CLI Tools. Unix Console.
IT и технологии · 30 апреля 2026 г.
🔥 Предупреждение о переполнении дисков + топ “пожирателей” места — 30 апреля 2026 г. в 08:53:00.662
🔥 Предупреждение о переполнении дисков + топ “пожирателей” места Данный ниже скрипт проверит заполнение всех ФС (кроме 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. 👉 @bash_srv

