#!/usr/bin/env bash # # disk-monitor.sh — Check disk usage and alert when above threshold. # # Usage: # disk-monitor.sh # print usage, warn at 80% # disk-monitor.sh --warn-percent 90 # custom threshold # # Requires GNU coreutils df (standard on Debian). Uses --output for # deterministic column ordering regardless of locale. # # Exit code 0 if under threshold, 1 if at or above. set -euo pipefail WARN_PERCENT=80 while [[ $# -gt 0 ]]; do case "$1" in --warn-percent) WARN_PERCENT="$2" shift 2 ;; *) echo "Unknown argument: $1" >&2 exit 2 ;; esac done GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' EXIT_CODE=0 # Partitions to check: install root and /var (Docker data-root is often here) PARTITIONS="${PARTITIONS:-/ /var}" for partition in $PARTITIONS; do if [[ ! -d "$partition" ]]; then continue fi # GNU df --output columns: pcent (Use%), size, avail, target (Mounted on) read -r USAGE_PCT SIZE AVAIL MOUNT <<< "$(df -h --output=pcent,size,avail,target "$partition" | awk 'NR==2 {gsub(/%/,"",$1); print $1, $2, $3, $4}')" if [[ -z "${USAGE_PCT:-}" || ! "${USAGE_PCT:-}" =~ ^[0-9]+$ ]]; then echo " [skip] Could not read usage for ${partition}" continue fi if [[ "$USAGE_PCT" -ge "$WARN_PERCENT" ]]; then echo -e " ${RED}WARN${NC} ${MOUNT}: ${USAGE_PCT}% used (${AVAIL} avail of ${SIZE}) — threshold ${WARN_PERCENT}%" EXIT_CODE=1 elif [[ "$USAGE_PCT" -ge $((WARN_PERCENT - 10)) ]]; then echo -e " ${YELLOW}NOTE${NC} ${MOUNT}: ${USAGE_PCT}% used (${AVAIL} avail of ${SIZE}) — approaching threshold" else echo -e " ${GREEN}OK${NC} ${MOUNT}: ${USAGE_PCT}% used (${AVAIL} avail of ${SIZE})" fi done exit "$EXIT_CODE"