Shell脚本如何监控虚拟机性能指标

wen 实用脚本 1

本文目录导读:

Shell脚本如何监控虚拟机性能指标

  1. 基础监控脚本框架
  2. CPU监控函数
  3. 内存监控函数
  4. 磁盘监控函数
  5. 网络监控函数
  6. 进程监控函数
  7. 完整监控脚本
  8. 配置示例
  9. 安装依赖
  10. 使用示例

我来详细介绍Shell脚本监控虚拟机性能指标的方法。

基础监控脚本框架

#!/bin/bash
# 性能监控脚本 - monitor_vm_perf.sh
# 日志文件
LOG_FILE="/var/log/vm_perf_monitor.log"
ALERT_LOG="/var/log/vm_perf_alert.log"
# 告警阈值
CPU_ALERT=80
MEM_ALERT=90
DISK_ALERT=85
LOAD_ALERT=5.0
# 监控间隔(秒)
INTERVAL=60
# 获取时间戳
get_timestamp() {
    date "+%Y-%m-%d %H:%M:%S"
}
# 日志函数
log_message() {
    local level=$1
    local message=$2
    echo "$(get_timestamp) [$level] $message" >> "$LOG_FILE"
}

CPU监控函数

# CPU使用率监控
monitor_cpu() {
    # 获取CPU使用率(使用top命令)
    CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
    # 另一种方法:使用mpstat(需要安装sysstat)
    # CPU_USAGE=$(mpstat 1 1 | awk '/^Average:/ {print 100 - $NF}')
    # CPU负载
    CPU_LOAD=$(cat /proc/loadavg | awk '{print $1}')
    # 获取CPU核心数
    CPU_CORES=$(nproc)
    echo "CPU_USAGE: $CPU_USAGE%"
    echo "CPU_LOAD: $CPU_LOAD (1分钟)"
    echo "CPU_CORES: $CPU_CORES"
    # 告警检查
    if (( $(echo "$CPU_USAGE > $CPU_ALERT" | bc -l) )); then
        log_message "ALERT" "CPU使用率过高: ${CPU_USAGE}%"
        echo "ALERT: CPU使用率超过阈值!"
    fi
}

内存监控函数

# 内存使用监控
monitor_memory() {
    # 获取内存信息
    MEM_TOTAL=$(free -m | awk '/^Mem:/ {print $2}')
    MEM_USED=$(free -m | awk '/^Mem:/ {print $3}')
    MEM_FREE=$(free -m | awk '/^Mem:/ {print $4}')
    MEM_AVAILABLE=$(free -m | awk '/^Mem:/ {print $7}')
    # 计算使用率
    MEM_USAGE=$(echo "scale=2; $MEM_USED * 100 / $MEM_TOTAL" | bc)
    # 交换内存
    SWAP_TOTAL=$(free -m | awk '/^Swap:/ {print $2}')
    SWAP_USED=$(free -m | awk '/^Swap:/ {print $3}')
    echo "MEM_TOTAL: ${MEM_TOTAL}MB"
    echo "MEM_USED: ${MEM_USED}MB"
    echo "MEM_FREE: ${MEM_FREE}MB"
    echo "MEM_AVAILABLE: ${MEM_AVAILABLE}MB"
    echo "MEM_USAGE: ${MEM_USAGE}%"
    echo "SWAP_USED: ${SWAP_USED}MB"
    # 告警检查
    if (( $(echo "$MEM_USAGE > $MEM_ALERT" | bc -l) )); then
        log_message "ALERT" "内存使用率过高: ${MEM_USAGE}%"
        echo "ALERT: 内存使用率超过阈值!"
    fi
}

磁盘监控函数

# 磁盘IO监控
monitor_disk_io() {
    # 磁盘使用率
    echo "=== 磁盘使用情况 ==="
    df -h | grep -v "tmpfs\|devtmpfs" | awk '{print $1, $5, $6}'
    # 磁盘IO统计(需要iostat命令)
    if command -v iostat &> /dev/null; then
        echo "=== 磁盘IO统计 ==="
        iostat -x 1 1 | tail -n +4 | head -n -2
    fi
    # 磁盘读写速度
    echo "=== 磁盘读写速度 ==="
    iostat -d 1 1 | grep -v "loop\|ram"
    # 检查磁盘使用率告警
    df -h | grep -v "tmpfs\|devtmpfs" | while read line; do
        USAGE=$(echo $line | awk '{print $5}' | sed 's/%//')
        MOUNT=$(echo $line | awk '{print $6}')
        if [ $USAGE -gt $DISK_ALERT ]; then
            log_message "ALERT" "磁盘使用率过高: ${MOUNT} ${USAGE}%"
            echo "ALERT: 磁盘 ${MOUNT} 使用率超过阈值!"
        fi
    done
}

网络监控函数

# 网络流量监控
monitor_network() {
    echo "=== 网络接口状态 ==="
    ip -s link show | grep -A2 "eth\|ens\|enp" | head -20
    # 网络连接数
    echo "=== 当前连接数 ==="
    echo "TCP连接数: $(ss -t state established | wc -l)"
    echo "总连接数: $(ss -tn | wc -l)"
    # 网络流量统计
    if command -v iftop &> /dev/null; then
        echo "=== 网络流量 ==="
        iftop -t -s 1 -n -P 2>/dev/null | head -20
    fi
}

进程监控函数

# 进程资源监控
monitor_processes() {
    echo "=== 资源消耗TOP10进程 ==="
    # CPU消耗TOP10
    echo "--- CPU使用TOP10 ---"
    ps aux --sort=-%cpu | head -11
    # 内存消耗TOP10
    echo "--- 内存使用TOP10 ---"
    ps aux --sort=-%mem | head -11
    # 僵尸进程检查
    ZOMBIE_COUNT=$(ps aux | awk '{if ($8 == "Z") print}' | wc -l)
    if [ $ZOMBIE_COUNT -gt 0 ]; then
        echo "僵尸进程数: $ZOMBIE_COUNT"
        log_message "WARN" "存在 $ZOMBIE_COUNT 个僵尸进程"
    fi
}

完整监控脚本

#!/bin/bash
# 完整性能监控脚本 - full_vm_monitor.sh
# 配置
CONFIG_FILE="/etc/vm_monitor.conf"
LOG_DIR="/var/log/vm_perf"
HOSTNAME=$(hostname)
INTERVAL=300  # 5分钟
# 创建日志目录
mkdir -p $LOG_DIR
# 读取配置文件(如果存在)
if [ -f "$CONFIG_FILE" ]; then
    source "$CONFIG_FILE"
fi
# 收集所有性能指标
collect_all_metrics() {
    local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
    local report_file="${LOG_DIR}/report_$(date +%Y%m%d_%H%M%S).log"
    {
        echo "================================"
        echo "虚拟机性能监控报告"
        echo "主机名: $HOSTNAME"
        echo "时间: $timestamp"
        echo "================================"
        echo ""
        echo "【系统基本信息】"
        echo "内核版本: $(uname -r)"
        echo "系统架构: $(uname -m)"
        echo "运行时间: $(uptime -p)"
        echo "当前用户: $(whoami)"
        echo ""
        echo "【CPU信息】"
        monitor_cpu
        echo ""
        echo "【内存信息】"
        monitor_memory
        echo ""
        echo "【磁盘信息】"
        monitor_disk_io
        echo ""
        echo "【进程信息】"
        monitor_processes
        echo ""
        echo "【网络信息】"
        monitor_network
        echo ""
        echo "【系统负载】"
        uptime
        echo "当前进程数: $(ps aux | wc -l)"
    } > "$report_file"
    echo "报告已保存到: $report_file"
}
# 发送告警函数
send_alert() {
    local subject=$1
    local message=$2
    # 可配置发送邮件、短信或webhook
    # mail -s "$subject" admin@example.com <<< "$message"
    # curl -X POST -H "Content-Type: application/json" \
    #      -d "{\"subject\":\"$subject\",\"message\":\"$message\"}" \
    #      http://alert-manager.example.com/api/alert
    echo "ALERT: $subject - $message" >> "$ALERT_LOG"
}
# 主循环
main_loop() {
    while true; do
        collect_all_metrics
        # 检查是否需要告警
        check_alerts
        sleep $INTERVAL
    done
}
# 运行模式选择
case "${1:-interactive}" in
    "interactive")
        # 交互模式:一次性收集并显示
        collect_all_metrics
        cat "${LOG_DIR}/report_$(date +%Y%m%d_%H%M%S).log"
        ;;
    "daemon")
        # 守护进程模式:持续监控
        echo "启动监控守护进程..."
        main_loop &
        ;;
    "status")
        # 查看状态
        cat "${LOG_DIR}/report_$(ls -t ${LOG_DIR}/report_*.log | head -1)" 2>/dev/null || echo "无监控数据"
        ;;
    *)
        echo "用法: $0 [interactive|daemon|status]"
        exit 1
        ;;
esac

配置示例

# 配置文件 /etc/vm_monitor.conf
# 告警阈值
CPU_ALERT=80
MEM_ALERT=90
DISK_ALERT=85
LOAD_ALERT=5.0
# 监控间隔(秒)
INTERVAL=60
# 邮件告警配置
SMTP_SERVER="smtp.example.com"
SMTP_PORT=25
ALERT_EMAIL="admin@example.com"
# Webhook配置
WEBHOOK_URL="http://alert-manager.example.com/api/alert"
# 需要监控的磁盘挂载点
MONITOR_DISKS="/ /home /data"
# 需要排除的进程
EXCLUDE_PROCESSES="httpd sshd"

安装依赖

#!/bin/bash
# 安装必要工具
install_dependencies() {
    # Debian/Ubuntu
    if [ -f /etc/debian_version ]; then
        apt-get update
        apt-get install -y sysstat bc iotop iftop htop
    # RHEL/CentOS
    elif [ -f /etc/redhat-release ]; then
        yum install -y sysstat bc iotop iftop htop
    # openSUSE
    elif [ -f /etc/SuSE-release ]; then
        zypper install -y sysstat bc iotop iftop htop
    fi
    # 启动sysstat服务
    systemctl enable sysstat
    systemctl start sysstat
}

使用示例

# 1. 交互模式 - 直接查看当前性能
./full_vm_monitor.sh interactive
# 2. 守护进程模式 - 后台持续监控
./full_vm_monitor.sh daemon
# 3. 查看最新报告
./full_vm_monitor.sh status
# 4. 设置定时任务(crontab)
# 每10分钟执行一次
*/10 * * * * /opt/scripts/full_vm_monitor.sh interactive
# 5. 查看监控日志
tail -f /var/log/vm_perf_monitor.log

这个监控脚本涵盖了虚拟机的关键性能指标,包括CPU、内存、磁盘、网络和进程监控,并且支持告警功能,你可以根据实际需求调整阈值和监控间隔。

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