本文目录导读:

我来详细介绍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、内存、磁盘、网络和进程监控,并且支持告警功能,你可以根据实际需求调整阈值和监控间隔。