Shell脚本如何监控Swap交换分区

wen 实用脚本 1

本文目录导读:

Shell脚本如何监控Swap交换分区

  1. 使用 free 命令监控
  2. 使用 swapon 命令监控
  3. /proc/swaps/proc/meminfo 读取
  4. 完整的监控脚本示例
  5. 简易实时监控(1秒刷新)
  6. 配合 vmstat 监控Swap活动
  7. 使用建议

在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/文件系统获取更精确的数据。

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