247 lines
6.8 KiB
Bash
Executable File
247 lines
6.8 KiB
Bash
Executable File
#!/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
|