本文目录导读:

- 使用
free命令监控 - 使用
swapon命令监控 - 从
/proc/swaps和/proc/meminfo读取 - 完整的监控脚本示例
- 简易实时监控(1秒刷新)
- 配合
vmstat监控Swap活动 - 使用建议
在Shell脚本中监控Swap交换分区,主要有以下几种常用方法:
使用 free 命令监控
#!/bin/bash
# 获取Swap信息
swap_total=$(free -m | awk '/^Swap:/ {print $2}')
swap_used=$(free -m | awk '/^Swap:/ {print $3}')
swap_free=$(free -m | awk '/^Swap:/ {print $4}')
swap_percent=$(awk "BEGIN {printf \"%.2f\", $swap_used / $swap_total * 100}")
echo "Swap Total: ${swap_total}MB"
echo "Swap Used: ${swap_used}MB"
echo "Swap Free: ${swap_free}MB"
echo "Swap Usage: ${swap_percent}%"
# 设置告警阈值(例如80%)
threshold=80
if (( $(echo "$swap_percent > $threshold" | bc -l) )); then
echo "警告: Swap使用率超过${threshold}%!"
fi
使用 swapon 命令监控
#!/bin/bash
# 使用swapon显示详细Swap信息
swapon --show | awk 'NR>1 {
printf "设备: %s\n类型: %s\n大小: %s\n已用: %s\n优先级: %s\n\n",
$1, $2, $3, $4, $5
}'
# 获取所有Swap设备的总使用率
total_swap=$(swapon --show --noheadings | awk '{sum+=$3} END {print sum}')
used_swap=$(swapon --show --noheadings | awk '{sum+=$4} END {print sum}')
if [ -n "$total_swap" ] && [ "$total_swap" != "0" ]; then
percent=$(awk "BEGIN {printf \"%.2f\", $used_swap / $total_swap * 100}")
echo "总Swap使用率: ${percent}%"
fi
从 /proc/swaps 和 /proc/meminfo 读取
#!/bin/bash
# 从/proc/meminfo获取Swap信息
swap_total=$(grep SwapTotal /proc/meminfo | awk '{print $2}')
swap_free=$(grep SwapFree /proc/meminfo | awk '{print $2}')
swap_used=$((swap_total - swap_free))
# 转换为MB
swap_total_mb=$((swap_total / 1024))
swap_used_mb=$((swap_used / 1024))
swap_free_mb=$((swap_free / 1024))
echo "Swap Total: ${swap_total_mb}MB"
echo "Swap Used: ${swap_used_mb}MB"
echo "Swap Free: ${swap_free_mb}MB"
# 计算使用率
if [ "$swap_total" -gt 0 ]; then
percent=$(awk "BEGIN {printf \"%.2f\", $swap_used / $swap_total * 100}")
echo "Swap Usage: ${percent}%"
fi
完整的监控脚本示例
#!/bin/bash
# Swap监控脚本
THRESHOLD_WARNING=80
THRESHOLD_CRITICAL=90
LOG_FILE="/var/log/swap_monitor.log"
ALERT_EMAIL="admin@example.com"
monitor_swap() {
# 获取Swap信息(KB单位)
swap_total=$(grep SwapTotal /proc/meminfo | awk '{print $2}')
swap_free=$(grep SwapFree /proc/meminfo | awk '{print $2}')
swap_used=$((swap_total - swap_free))
# 计算百分比
if [ "$swap_total" -gt 0 ]; then
percent=$((swap_used * 100 / swap_total))
else
percent=0
fi
# 转换为人类可读格式
total_mb=$((swap_total / 1024))
used_mb=$((swap_used / 1024))
free_mb=$((swap_free / 1024))
# 记录日志
echo "$(date '+%Y-%m-%d %H:%M:%S') - Swap: ${used_mb}MB/${total_mb}MB (${percent}%)" >> "$LOG_FILE"
# 告警逻辑
if [ "$percent" -ge "$THRESHOLD_CRITICAL" ]; then
echo "严重告警: Swap使用率 ${percent}% 超过临界阈值 ${THRESHOLD_CRITICAL}%!" | \
mail -s "Swap严重告警 $(hostname)" "$ALERT_EMAIL"
return 2
elif [ "$percent" -ge "$THRESHOLD_WARNING" ]; then
echo "警告: Swap使用率 ${percent}% 超过警告阈值 ${THRESHOLD_WARNING}%!" | \
mail -s "Swap警告 $(hostname)" "$ALERT_EMAIL"
return 1
fi
return 0
}
# 执行监控
monitor_swap
简易实时监控(1秒刷新)
#!/bin/bash watch -n 1 'free -m | grep -E "(Swap|total)"'
配合 vmstat 监控Swap活动
#!/bin/bash
# 监控Swap I/O活动
echo "监控Swap读写活动 (每5秒)"
echo "时间 si(从磁盘换入) so(换出到磁盘)"
vmstat 5 | awk '{if(NR>2) print strftime("%H:%M:%S"), $7, $8}'
使用建议
- 阈值设置:建议警告阈值设为60-80%,严重阈值设为90%
- 日志记录:将监控结果写入日志文件便于回溯
- 告警方式:结合邮件、短信或其他通知系统
- 持续监控:使用cron定时执行脚本
# crontab示例(每5分钟执行一次) */5 * * * * /path/to/swap_monitor.sh
选择哪种方法取决于具体需求,简单查看用free命令最方便,需要详细监控建议使用/proc/文件系统获取更精确的数据。