本文目录导读:

我来详细介绍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、内存、磁盘、网络和进程监控,并且支持告警功能,你可以根据实际需求调整阈值和监控间隔。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播