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