监控CPU利用率

硬盘利用率监控脚本:分区级别的磁盘空间预警

使用vmstat来分析CPU使用信息

#!/bin/bash

# 配置参数
CRITICAL_THRESHOLD=80   # 严重报警阈值(%)
WARNING_THRESHOLD=50    # 警告阈值(%)
CHECK_INTERVAL=60       # 检查间隔(秒)
MAIL="example@mail.com"
LOG_FILE="/var/log/cpu_monitor.log"
ALERT_HISTORY="/var/log/cpu_alert_history.log"

# 初始化文件
touch $LOG_FILE $ALERT_HISTORY
chmod 644 $LOG_FILE $ALERT_HISTORY

# 日志函数
log() {
    echo "[$(date +%F" "%H:%M:%S)] $1" >> $LOG_FILE
}

# 获取系统信息(兼容多系统)
get_system_info() {
    DATE=$(date +%F" "%H:%M:%S)
    # 兼容CentOS 6/7/8及Ubuntu
    IP=$(hostname -I 2>/dev/null | awk '{print $1}')
    if [ -z "$IP" ]; then
        IP=$(ifconfig | grep 'inet ' | grep -v '127.0.0.1' | head -1 | awk '{print $2}')
    fi
    HOSTNAME=$(hostname)
}

# 检查依赖命令
check_dependencies() {
    if ! which vmstat &>/dev/null; then
        log "错误:未找到vmstat命令,请安装procps包"
        echo "Error: vmstat command not found. Please install procps package." >&2
        exit 1
    fi
}

# 获取CPU详细指标
get_cpu_metrics() {
    # 使用vmstat 1 2取第二次采样,避免瞬时值偏差
    VMSTAT_OUTPUT=$(vmstat 1 2 | tail -1)
    US=$(echo $VMSTAT_OUTPUT | awk '{print $13}')  # 用户态CPU
    SY=$(echo $VMSTAT_OUTPUT | awk '{print $14}')  # 系统态CPU
    IDLE=$(echo $VMSTAT_OUTPUT | awk '{print $15}') # 空闲CPU
    WAIT=$(echo $VMSTAT_OUTPUT | awk '{print $16}') # IO等待CPU
    USE=$((US + SY))                               # 总使用率
}

# 检查冷却期
is_in_cooldown() {
    local current_time=$(date +%s)
    local last_alert=$(tail -1 $ALERT_HISTORY 2>/dev/null | awk '{print $1}')
    
    if [ -n "$last_alert" ]; then
        local time_diff=$((current_time - last_alert))
        # 严重报警冷却30分钟,普通警告冷却2小时
        if [ $1 -ge $CRITICAL_THRESHOLD ] && [ $time_diff -lt 1800 ]; then
            return 0
        elif [ $time_diff -lt 7200 ]; then
            return 0
        fi
    fi
    return 1
}

# 记录报警
record_alert() {
    echo "$(date +%s) $1" >> $ALERT_HISTORY
}

# 发送报警邮件
send_alert() {
    local level=$1
    local subject="CPU监控报警[$level]:$HOSTNAME($IP)"
    local body="
    服务器CPU使用率异常,请关注!
    
    时间:$DATE
    主机:$HOSTNAME($IP)
    CPU使用率:$USE% (用户态:$US% 系统态:$SY%)
    空闲CPU:$IDLE%
    IO等待:$WAIT%
    
    阈值:警告=$WARNING_THRESHOLD%  严重=$CRITICAL_THRESHOLD%
    "
    
    if ! is_in_cooldown $USE; then
        echo "$body" | mail -s "$subject" $MAIL
        record_alert $USE
        log "发送$level报警邮件至$MAIL"
    else
        log "$level报警处于冷却期,暂不发送邮件"
    fi
}

# 主监控逻辑
main() {
    check_dependencies
    get_system_info
    get_cpu_metrics
    
    # 记录常规状态
    log "CPU状态 - 总使用率:$USE% (用户:$US% 系统:$SY%) 空闲:$IDLE% IO等待:$WAIT%"
    
    # 判断报警级别
    if [ $USE -ge $CRITICAL_THRESHOLD ]; then
        log "CPU严重超载:$USE% >= $CRITICAL_THRESHOLD%"
        send_alert "严重"
    elif [ $USE -ge $WARNING_THRESHOLD ]; then
        log "CPU警告:$USE% >= $WARNING_THRESHOLD%"
        send_alert "警告"
    fi
}

# 运行模式:定时任务单次执行或循环监控
if [ "$1" = "cron" ]; then
    main
else
    while true; do
        main
        sleep $CHECK_INTERVAL
    done
fi
  1. 多级阈值报警
    区分 “警告”(50%)和 “严重”(80%)两个阈值,根据 CPU 压力等级发送不同紧急程度的报警,避免过度反应或反应不足。
  2. 采样优化
    使用vmstat 1 2取第二次采样结果,过滤系统瞬时波动影响,使监控数据更准确。
  3. 智能冷却机制
    严重报警 30 分钟内不重复发送,普通警告 2 小时内不重复发送,平衡报警及时性和减少干扰。
  4. 全面指标监控
    不仅关注总使用率,还记录用户态 / 系统态 CPU 占比、IO 等待时间(WAIT),帮助定位 CPU 高负载原因(是应用问题还是系统 / IO 问题)。
  5. 跨系统兼容
    优化 IP 获取方式,兼容 CentOS 6/7/8、Ubuntu 等主流发行版,解决原脚本仅支持 CentOS 6 的局限。
  6. 灵活运行模式
    支持作为定时任务(cron)运行,或作为独立进程循环监控,适应不同部署场景