#!/bin/bash
#=====================================================
# CPU 实时监控脚本 - 当CPU超过阈值时告警
# 来源: 整合自 HariSekhon/DevOps-Bash-tools 及运维实践
# 用法: ./monitor-cpu.sh [阈值%] [检查间隔秒]
# 示例: ./monitor-cpu.sh 80 5
#=====================================================

THRESHOLD=${1:-80}
INTERVAL=${2:-5}
LOG_FILE="/var/log/cpu-monitor.log"

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

get_cpu_usage() {
    # 计算CPU使用率 - 取两次采样间隔
    local cpu_line1 cpu_line2 idle1 idle2 total1 total2
    cpu_line1=($(head -1 /proc/stat))
    sleep 1
    cpu_line2=($(head -1 /proc/stat))

    idle1=${cpu_line1[4]}
    idle2=${cpu_line2[4]}
    total1=0; total2=0
    for i in {1..10}; do
        total1=$((total1 + ${cpu_line1[$i]:-0}))
        total2=$((total2 + ${cpu_line2[$i]:-0}))
    done

    local diff_idle=$((idle2 - idle1))
    local diff_total=$((total2 - total1))
    echo $((100 * (diff_total - diff_idle) / diff_total))
}

echo -e "${GREEN}CPU 监控启动${NC}"
echo "  阈值: ${THRESHOLD}%"
echo "  间隔: ${INTERVAL}秒"
echo "  日志: ${LOG_FILE}"
echo ""

ALERT_COUNT=0

while true; do
    CPU_USAGE=$(get_cpu_usage)

    if [ "$CPU_USAGE" -ge "$THRESHOLD" ]; then
        ALERT_COUNT=$((ALERT_COUNT + 1))
        echo -e "${RED}[告警 #${ALERT_COUNT}] CPU使用率: ${CPU_USAGE}% (阈值: ${THRESHOLD}%)${NC}"

        # 找出TOP 5 CPU进程
        echo -e "${YELLOW}  TOP 5 CPU进程:${NC}"
        ps aux --sort=-%cpu | head -6 | tail -5 | while read line; do
            echo "    $line"
        done

        log "ALERT: CPU=${CPU_USAGE}% (阈值: ${THRESHOLD}%)"
    else
        echo -e "${GREEN}[正常] CPU使用率: ${CPU_USAGE}%${NC}"
        ALERT_COUNT=0
    fi

    sleep "$INTERVAL"
done