Shell脚本如何检查磁盘分区容量

wen 实用脚本 1

本文目录导读:

Shell脚本如何检查磁盘分区容量

  1. 使用 df 命令(最常用)
  2. 获取具体数值
  3. 完整检查脚本
  4. 高级检查 - 发送告警
  5. 使用 stat 命令检查特定目录
  6. 实时监控脚本
  7. 使用 findmnt 命令(更详细信息)
  8. 综合检查脚本
  9. 常用参数说明
  10. 最佳实践

在Shell脚本中,检查磁盘分区容量有多种方法,以下是最常用和可靠的方式:

使用 df 命令(最常用)

基本用法

# 查看所有分区
df -h
# 查看特定挂载点
df -h /home
# 查看特定设备
df -h /dev/sda1

脚本检查示例

#!/bin/bash
# 检查根分区使用率
usage=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
echo "根分区使用率: ${usage}%"
# 阈值检查
threshold=80
if [ "$usage" -gt "$threshold" ]; then
    echo "警告: 根分区使用率超过${threshold}%"
fi

获取具体数值

获取使用率(数字)

# 获取根分区使用率(不带%)
usage=$(df / | awk 'NR==2 {print $5}' | tr -d '%')
echo $usage

获取可用空间(GB)

# 获取根分区可用空间(GB)
available=$(df -BG / | awk 'NR==2 {print $4}' | sed 's/G//')
echo "可用空间: ${available}GB"

完整检查脚本

#!/bin/bash
# 定义要检查的分区列表
partitions="/ /home /var /tmp"
threshold=85
echo "磁盘分区使用情况检查..."
echo "=========================="
for partition in $partitions; do
    # 检查分区是否挂载
    if mountpoint -q "$partition" 2>/dev/null; then
        # 获取使用率
        usage=$(df -h "$partition" | awk 'NR==2 {print $5}' | tr -d '%')
        echo -n "分区 $partition: 使用率 ${usage}%"
        if [ "$usage" -gt "$threshold" ]; then
            echo " ⚠️ 警告: 超过阈值 ${threshold}%"
        else
            echo " ✅ 正常"
        fi
    else
        echo "分区 $partition: 未挂载"
    fi
done

高级检查 - 发送告警

#!/bin/bash
# 检查多个分区并发送邮件告警
check_disk_space() {
    local threshold=$1
    local alert_email="admin@example.com"
    local alert_message=""
    # 获取所有挂载的分区(排除临时和虚拟文件系统)
    df -h | grep -E "^/dev/" | while read line; do
        filesystem=$(echo $line | awk '{print $1}')
        mount_point=$(echo $line | awk '{print $6}')
        usage=$(echo $line | awk '{print $5}' | tr -d '%')
        if [ "$usage" -gt "$threshold" ]; then
            alert_message+="警告: 分区 $mount_point ($filesystem) 使用率已达 ${usage}%\n"
        fi
    done
    # 如果有警告,发送邮件
    if [ -n "$alert_message" ]; then
        echo -e "$alert_message" | mail -s "磁盘空间警告" "$alert_email"
    fi
}
# 执行检查,阈值设为90%
check_disk_space 90

使用 stat 命令检查特定目录

#!/bin/bash
# 检查特定目录所在分区的空间
directory="/var/log"
if [ -d "$directory" ]; then
    # 获取所在分区的使用情况
    df -h "$directory" | tail -1 | awk '{print "挂载点:", $6, "使用率:", $5}'
    # 获取具体数值
    available=$(df "$directory" | awk 'NR==2 {print $4}')
    echo "可用inode: $available"
fi

实时监控脚本

#!/bin/bash
# 持续监控磁盘使用
monitor_disk() {
    local interval=300  # 5分钟
    local threshold=90
    while true; do
        echo "$(date): 检查磁盘空间..."
        df -h | awk 'NR>1 {print $6, $5}' | while read mount usage; do
            usage_num=${usage%\%}
            if [ "$usage_num" -gt "$threshold" ]; then
                echo "⚠️ $mount 使用率 $usage"
            fi
        done
        sleep $interval
    done
}
# 运行监控
# monitor_disk

使用 findmnt 命令(更详细信息)

#!/bin/bash
# 获取分区详细信息
findmnt -T / | awk 'NR==2 {print "源设备:", $1, "挂载点:", $2, "大小:", $3, "已用:", $4, "可用:", $5}'
# 或直接使用
findmnt -o TARGET,SOURCE,FSTYPE,SIZE,USED,AVAIL,USE% -t ext4,xfs

综合检查脚本

#!/bin/bash
echo "=== 磁盘分区容量检查 ==="
echo
# 1. 简单查看
echo "1. 所有分区概览:"
df -h --total | grep -v tmpfs
echo
# 2. 关键分区详细检查
echo "2. 关键分区状态:"
partitions=("/" "/home" "/var" "/tmp" "/boot")
for part in "${partitions[@]}"; do
    if mountpoint -q "$part" 2>/dev/null; then
        df_output=$(df -h "$part" | awk 'NR==2')
        echo "  $part: $(echo $df_output | awk '{print "总大小:", $2, "已用:", $3, "可用:", $4, "使用率:", $5}')"
    fi
done
echo
# 3. 警报检查
echo "3. 警报检查:"
warning_threshold=80
critical_threshold=90
df -h | awk 'NR>1 && $1 ~ /^\// {print $6, $5}' | while read mount usage; do
    usage_num=$(echo $usage | tr -d '%')
    if [ "$usage_num" -ge "$critical_threshold" ]; then
        echo "  🔴 严重: $mount 使用率 $usage"
    elif [ "$usage_num" -ge "$warning_threshold" ]; then
        echo "  🟡 警告: $mount 使用率 $usage"
    else
        echo "  🟢 正常: $mount 使用率 $usage"
    fi
done

常用参数说明

命令 参数 说明
df -h 人类可读格式(GB/MB)
df -H 人类可读(1000进制)
df -k KB 为单位
df -m MB 为单位
df -i 显示 inode 使用情况
df -T 显示文件系统类型
df -x tmpfs 排除某些文件系统
df --total 显示总计

最佳实践

  1. 始终使用 -h 参数 使其更易读
  2. 设置合理的阈值(通常80%警告,90%严重)
  3. 排除临时文件系统df -x tmpfs -x devtmpfs
  4. 定期检查:配合 cron 实现自动检查
  5. 记录日志:将检查结果写入日志文件

这些方法涵盖了从简单到复杂的不同需求,可以根据具体场景选择合适的实现方式。

抱歉,评论功能暂时关闭!