Files
2025-11-29 18:24:37 +08:00

247 lines
6.8 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# 磁盘健康检查器 - 检查磁盘空间、inode使用和健康状态
set -e
DISK_PATH="${1:-/}"
THRESHOLD="${2:-80}"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# 帮助信息
usage() {
echo "💾 磁盘健康检查器"
echo ""
echo "使用: $0 [路径] [阈值]"
echo ""
echo "参数:"
echo " 路径 要检查的磁盘路径 (默认: /)"
echo " 阈值 空间使用警报阈值百分比 (默认: 80%)"
echo ""
echo "示例:"
echo " $0 # 检查根目录阈值80%"
echo " $0 /home 85 # 检查/home目录阈值85%"
echo " $0 /var/log 90 # 检查日志目录阈值90%"
echo ""
}
# 检查参数
if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
usage
exit 0
fi
# 检查路径是否存在
if [ ! -d "$DISK_PATH" ]; then
echo "❌ 错误: 路径不存在: $DISK_PATH"
exit 1
fi
# 数字验证
if ! [[ "$THRESHOLD" =~ ^[0-9]+$ ]] || [ "$THRESHOLD" -lt 1 ] || [ "$THRESHOLD" -gt 100 ]; then
echo "❌ 错误: 阈值必须是1-100之间的数字"
exit 1
fi
echo "💾 磁盘健康检查器"
echo "=========================================="
echo "检查路径: ${BLUE}$DISK_PATH${NC}"
echo "警报阈值: ${THRESHOLD}%"
echo "=========================================="
echo ""
# 获取磁盘使用情况
DISK_INFO=$(df -h "$DISK_PATH" | tail -1)
DISK_DEVICE=$(echo "$DISK_INFO" | awk '{print $1}')
DISK_SIZE=$(echo "$DISK_INFO" | awk '{print $2}')
DISK_USED=$(echo "$DISK_INFO" | awk '{print $3}')
DISK_AVAIL=$(echo "$DISK_INFO" | awk '{print $4}')
DISK_USAGE_PERCENT=$(echo "$DISK_INFO" | awk '{print $5}' | sed 's/%//')
echo "📊 磁盘使用概况:"
echo "=========================================="
echo -e "设备: ${CYAN}$DISK_DEVICE${NC}"
echo -e "总容量: ${BLUE}$DISK_SIZE${NC}"
echo -e "已使用: ${YELLOW}$DISK_USED${NC}"
echo -e "可用: ${GREEN}$DISK_AVAIL${NC}"
# 使用百分比颜色标记
if [ "$DISK_USAGE_PERCENT" -gt 90 ]; then
USAGE_COLOR="$RED"
STATUS="🔴 严重"
elif [ "$DISK_USAGE_PERCENT" -gt "$THRESHOLD" ]; then
USAGE_COLOR="$YELLOW"
STATUS="🟡 警告"
else
USAGE_COLOR="$GREEN"
STATUS="🟢 正常"
fi
echo -e "使用率: ${USAGE_COLOR}${DISK_USAGE_PERCENT}%${NC} $STATUS"
echo ""
# inode检查
echo "=========================================="
echo "📂 Inode使用概况:"
echo "=========================================="
INODE_INFO=$(df -i "$DISK_PATH" | tail -1)
INODE_USED_PERCENT=$(echo "$INODE_INFO" | awk '{print $5}' | sed 's/%//')
INODE_TOTAL=$(echo "$INODE_INFO" | awk '{print $2}')
INODE_USED=$(echo "$INODE_INFO" | awk '{print $3}')
INODE_AVAIL=$(echo "$INODE_INFO" | awk '{print $4}')
echo -e "总数: ${BLUE}$INODE_TOTAL${NC}"
echo -e "已使用: ${YELLOW}$INODE_USED${NC}"
echo -e "可用: ${GREEN}$INODE_AVAIL${NC}"
# Inode百分比颜色
if [ "$INODE_USED_PERCENT" -gt 90 ]; then
INODE_COLOR="$RED"
INODE_STATUS="🔴 严重"
elif [ "$INODE_USED_PERCENT" -gt "$THRESHOLD" ]; then
INODE_COLOR="$YELLOW"
INODE_STATUS="🟡 警告"
else
INODE_COLOR="$GREEN"
INODE_STATUS="🟢 正常"
fi
echo -e "使用率: ${INODE_COLOR}${INODE_USED_PERCENT}%${NC} $INODE_STATUS"
echo ""
# 详细信息检测
echo "=========================================="
echo "🔍 详细信息:"
echo "=========================================="
# 文件系统类型
FS_TYPE=$(df -T "$DISK_PATH" | tail -1 | awk '{print $2}')
echo -e "文件系统类型: ${CYAN}$FS_TYPE${NC}"
# 挂载点
MOUNT_POINT=$(df "$DISK_PATH" | tail -1 | awk '{print $NF}')
echo -e "挂载点: ${BLUE}$MOUNT_POINT${NC}"
# 可读写性检测
if [ -w "$DISK_PATH" ]; then
RW_STATUS="${GREEN}可读写${NC}"
else
RW_STATUS="${RED}只读${NC}"
fi
echo -e "访问权限: $RW_STATUS"
echo ""
# 警报检查
echo "=========================================="
echo "🚨 警报检查:"
echo "=========================================="
ALERT_COUNT=0
if [ "$DISK_USAGE_PERCENT" -gt 90 ]; then
echo -e "⚠️ 磁盘使用率过高: ${RED}${DISK_USAGE_PERCENT}%${NC}"
((ALERT_COUNT++))
fi
if [ "$DISK_USAGE_PERCENT" -gt "$THRESHOLD" ]; then
echo -e "⚠️ 磁盘使用率超过阈值": "${DISK_USAGE_PERCENT}% > ${THRESHOLD}%"
fi
if [ "$INODE_USED_PERCENT" -gt 90 ]; then
echo -e "⚠️ Inode使用率过高: ${RED}${INODE_USED_PERCENT}%${NC}"
((ALERT_COUNT++))
fi
if [ "$INODE_USED_PERCENT" -gt "$THRESHOLD" ]; then
echo -e "⚠️ Inode使用率超过阈值": "${INODE_USED_PERCENT}% > ${THRESHOLD}%"
fi
if [ ! -w "$DISK_PATH" ]; then
echo -e "⚠️ ${YELLOW}磁盘为只读状态${NC}"
((ALERT_COUNT++))
fi
echo ""
echo "=========================================="
echo "📈 性能指标:"
echo "=========================================="
# 检查磁盘是被大量小文件填满还是少数大文件
echo "按大小排序的顶级目录:"
du -h "$DISK_PATH" 2>/dev/null | sort -hr | head -5 | while read -r size path; do
echo -e " ${YELLOW}$size${NC}\t$path"
done
echo ""
echo "按数量排序的顶级目录:"
find "$DISK_PATH" -maxdepth 2 -type d 2>/dev/null | head -10 | while read -r dir; do
count=$(find "$dir" -maxdepth 1 -type f 2>/dev/null | wc -l)
if [ "$count" -gt 100 ]; then
echo -e " ${YELLOW}$count${NC}个文件\t$dir"
fi
done
echo ""
echo "=========================================="
echo "💡 建议:"
echo "=========================================="
if [ "$ALERT_COUNT" -gt 0 ]; then
echo "🚨 发现 $ALERT_COUNT 个问题需要处理:"
echo ""
if [ "$DISK_USAGE_PERCENT" -gt 90 ]; then
echo " 磁盘使用率超过90%:"
echo " - 建议立即清理日志文件(/var/log"
echo " - 检查临时文件(/tmp"
echo " - 考虑扩容或迁移数据"
echo ""
fi
if [ "$INODE_USED_PERCENT" -gt 90 ]; then
echo " Inode使用率高:"
echo " - 通常由大量小文件导致"
echo " - 检查并清理临时文件"
echo " - 查找并删除空文件"
echo " - 可能是邮件队列或缓存文件过多"
echo ""
fi
if [ ! -w "$DISK_PATH" ]; then
echo " 磁盘只读:"
echo " - 检查文件系统错误fsck"
echo " - 可能是磁盘故障或挂载问题"
echo " - 需要root权限检查和修复"
echo ""
fi
else
echo "✅ 磁盘健康状况良好"
echo ""
if [ "$DISK_USAGE_PERCENT" -lt 70 ]; then
echo " - 使用率充足,暂无扩容需求"
fi
if [ "$INODE_USED_PERCENT" -lt 70 ]; then
echo " - Inode充足无小文件问题"
fi
echo ""
echo " 💡 建议定期运行此工具监控磁盘状态"
fi
echo ""
echo "=========================================="
echo "磁盘检查完成"
echo "=========================================="
exit 0