本文目录导读:

在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 |
显示总计 |
最佳实践
- 始终使用
-h参数 使其更易读 - 设置合理的阈值(通常80%警告,90%严重)
- 排除临时文件系统:
df -x tmpfs -x devtmpfs - 定期检查:配合 cron 实现自动检查
- 记录日志:将检查结果写入日志文件
这些方法涵盖了从简单到复杂的不同需求,可以根据具体场景选择合适的实现方式。