1、监控系统中的cpu、内存、硬盘、、使用率超过80%进行邮件告警(可使用邮箱QQ)
详细步骤说明:
1. 脚本初始化
#!/bin/bash
:指定使用bash shell执行dateMax=80
:设置资源使用率阈值(80%)
2. 资源监控
CPU使用率:
top -bn1 | grep "Cpu" | awk '{print 100 - $8}'
top -bn1
:获取一次系统状态grep "Cpu"
:过滤CPU信息awk '{print 100 - $8}'
:计算CPU使用率(100% - 空闲百分比)
内存使用率:
free -m | awk '/Mem:/ {printf "%.2f", $3/$2*100}'
free -m
:以MB为单位显示内存信息awk
计算已用内存占总内存的百分比
磁盘使用率:
df -h / | awk 'NR==2 {gsub("%","",$5); print $5}'
df -h /
:显示根分区磁盘使用情况awk
提取使用率百分比
3. 日志记录
echo "$(date '+%Y-%m-%d %H:%M:%S'): ..." >> /var/log/monitor.log
所有输出都追加到日志文件
包含时间戳便于追踪
4. 条件判断
使用
bc
命令进行浮点数比较三个条件任一满足即触发告警:
CPU使用率 > 80%
内存使用率 > 80%
磁盘使用率 > 80%
5. 告警处理
生成告警描述信息
发送邮件到指定邮箱
记录邮件发送结果(成功/失败)
6. 正常情况
资源使用率正常时记录"系统资源正常"
脚本详情:
#!/bin/bash
#设置阈值
dateMax=80
#获取系统资源使用率
CPULimit=$(top -bn1 | grep "Cpu" | awk '{print 100- $8}')
RAMLimit=$(free -m | awk '/Mem:/ {printf("%.2f"), $3/$2*100}')
#CPU 内存 硬盘监控
if [ $(echo "$CPULimit > $dateMax" | bc) -eq 1 ] || \
[ $(echo "$RAMLimit > $dateMax" | bc) -eq 1 ] || \
[ $DISKLimit -gt $dateMax ]
thentitle="资源告急"
desc="资源告急,CPU使用率高达${CPULimit}%,内存使用率高达${RAMLimit}%,磁盘使用率>高达${DISKLimit}%"
# 记录告警信息到日志
echo "$(date '+%Y-%m-%d %H:%M:%S'): $desc" >> /var/log/monitor.log
#发送邮件
echo "$desc" | mailx -s "$title" "123456@qq.com"
#检查邮件发送结果
if [ $? -eq 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S'): 告警邮件发送成功" >> /var/log/monitor.log
else
echo "$(date '+%Y-%m-%d %H:%M:%S'): 告警邮件发送失败" >> /var/log/monitor.log
fi
else
echo "$(date '+%Y-%m-%d %H:%M:%S'): 系统资源正常" >> /var/log/monitor.log
fi
2、监控系统中的IO await大于50进行邮件告警(可使用邮箱QQ)
脚本详解
1. 配置参数部分
#!/bin/bash
# 配置参数
IOMax=50
EMAIL="123456@qq.com"
LOG_FILE="/var/log/io_monitor.log"
#!/bin/bash
: 指定使用Bash shell执行脚本IOMax=50
: 设置IO使用率阈值,超过50%触发告警EMAIL
: 设置接收告警邮件的邮箱地址LOG_FILE
: 设置日志文件路径
2. 获取IO使用率
# 使用 iostat -x 获取sda设备的IO使用率(%util)
IOLimit=$(iostat -x 1 2 | awk '/sda/ {print $NF}' | tail -1 | cut -d'.' -f1)
这条命令的详细解析:
iostat -x 1 2
: 显示扩展IO统计信息,每秒刷新一次,共显示2次awk '/sda/ {print $NF}'
: 过滤包含"sda"的行,并打印最后一列(%util)tail -1
: 取最后一行(第二次采样的结果)cut -d'.' -f1
: 去掉小数部分,只取整数
3. 记录日常日志
# 记录日志
echo "$(date '+%Y-%m-%d %H:%M:%S'): IO使用率 $IOLimit%" >> "$LOG_FILE"
将当前时间和IO使用率记录到日志文件中。
4. 判断和告警逻辑
# 判断是否超过阈值
if [[ $IOLimit -gt $IOMax ]]
then
title="IO告急"
desc="IO告急,当前IO使用率高达${IOLimit}%,超过阈值${IOMax}%"
# 记录告警日志
echo "$(date '+%Y-%m-%d %H:%M:%S'): $desc" >> "$LOG_FILE"
# 发送邮件
echo -e "Subject: $title\n\n$desc" | msmtp "$EMAIL"
# 检查发送结果
if [ $? -eq 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S'): IO告警邮件发送成功" >> "$LOG_FILE"
else
echo "$(date '+%Y-%m-%d %H:%M:%S'): IO告警邮件发送失败" >> "$LOG_FILE"
fi
fi
脚本详情:
# 配置参数
#!/bin/bash
IOMax=50
EMAIL="123456@qq.com"
LOG_FILE="/var/log/io_monitor.log"
# 使用 iostat -x 获取sda设备的IO使用率(%util)
IOLimit=$(iostat -x 1 2 | awk '/sda/ {print $NF}' | tail -1 | cut -d'.' -f1)
# 记录日志
echo "$(date '+%Y-%m-%d %H:%M:%S'): IO使用率 $IOLimit%" >> "$LOG_FILE"
# 判断是否超过阈值
if [[ $IOLimit -gt $IOMax ]]
then
title="IO告急"
desc="IO告急,当前IO使用率高达${IOLimit}%,超过阈值${IOMax}%"
# 记录告警日志
echo "$(date '+%Y-%m-%d %H:%M:%S'): $desc" >> "$LOG_FILE"
# 发送邮件
echo -e "Subject: $title\n\n$desc" | msmtp "$EMAIL"
# 检查发送结果
if [ $? -eq 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S'): IO告警邮件发送成功" >> "$LOG_FILE"
else
echo "$(date '+%Y-%m-%d %H:%M:%S'): IO告警邮件发送失败" >> "$LOG_FILE"
fi
fi
3、监控系统中的网络流量下载上传超过10M(可变)进行邮件告警(可使用邮箱QQ)
详细步骤解析
1. 变量初始化
bash
NIC="ens33" # 要监控的网络接口名称
LIMIT=10 # 限制值(单位:MB/s)
NATLimit=10 # 用于判断的阈值(单位:MB/s)
EMAIL_TO="123456@qq.com" # 告警邮件接收地址
2. 获取初始网络统计
bash
rx1=$(cat /sys/class/net/$NIC/statistics/rx_bytes) # 获取初始接收字节数
tx1=$(cat /sys/class/net/$NIC/statistics/tx_bytes) # 获取初始发送字节数
sleep 1 # 等待1秒
3. 获取第二次网络统计并计算速率
bash
rx2=$(cat /sys/class/net/$NIC/statistics/rx_bytes) # 获取第二次接收字节数
tx2=$(cat /sys/class/net/$NIC/statistics/tx_bytes) # 获取第二次发送字节数
# 计算速率(字节/秒 → MB/秒)
rx_rate=$(( (rx2 - rx1) / 1024 / 1024 )) # 下载速率
tx_rate=$(( (tx2 - tx1) / 1024 / 1024 )) # 上传速率
4. 显示当前速率
bash
echo "上传速率: ${tx_rate} MB/s"
echo "下载速率: ${rx_rate} MB/s"
5. 阈值判断与告警处理
bash
if [[ $rx_rate -gt $NATLimit ]] || [[ $tx_rate -gt $NATLimit ]]; then
title="网络监控"
desc="网络带宽告急,下行速率高达${rx_rate},上行速率高达${tx_rate}MB/s,已超过 ${LIMIT}MB/s 的限制"
echo "警告: $desc"
6. 邮件发送
bash
# 使用mailx发送邮件
(
echo "Subject: $title"
echo "From: system_monitor@$(hostname)"
echo "To: 123456@qq.com" # 注意:这里与EMAIL_TO变量不一致
echo ""
echo "$desc"
echo ""
echo "监控时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "主机名: $(hostname)"
echo "网络接口: $NIC"
echo "阈值限制: ${LIMIT}MB/s"
) | mailx -s "$title" "$EMAIL_TO" 2>/dev/null
7. 邮件发送结果检查
bash
if [ $? -eq 0 ]; then
echo "邮件已发送 $EMAIL_TO"
else
echo "邮件发送失败,请检查 mailx 配置"
fi
#!/bin/bash
NIC="ens33"
LIMIT=10 # 单位 M/s
NATLimit=10 # 限制值(用于判断)
EMAIL_TO="123456@qq.com"
# 取两次字节数差值,算速率
rx1=$(cat /sys/class/net/$NIC/statistics/rx_bytes)
tx1=$(cat /sys/class/net/$NIC/statistics/tx_bytes)
sleep 1
rx2=$(cat /sys/class/net/$NIC/statistics/rx_bytes)
tx2=$(cat /sys/class/net/$NIC/statistics/tx_bytes)# 差值 -> 每秒字节数,再换算成 MB/s
rx_rate=$(( (rx2 - rx1) / 1024 / 1024 ))
tx_rate=$(( (tx2 - tx1) / 1024 / 1024 ))#引入上行速度和下行速度
echo "上传速率: ${tx_rate} MB/s"
echo "下载速率: ${rx_rate} MB/s"
#阈值判断
#网络监控
if [[ $rx_rate -gt $NATLimit ]] || [[ $tx_rate -gt $NATLimit ]];then
title="网络监控"
desc="网络带宽告急,下行速率高达${rx_rate},上行速率高达${tx_rate}MB/s,已超过 ${LIMIT}MB/s 的限制"
echo "警告: $desc"
#发送邮件
(
echo "Subject: $title"
echo "From: system_monitor@$(hostname)"
echo "To: 123456@qq.com"
echo ""
echo "$desc"
echo ""
echo "监控时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "主机名: $(hostname)"
echo "网络接口: $NIC"
echo "阈值限制: ${LIMIT}MB/s"
) | mailx -a default "123456@qq.com" 2>/dev/null
# 检查邮件是否发送成功
if [ $? -eq 0 ]; then
echo "邮件已发送 $EMAIL_TO"
else
echo "邮件发送失败,请检查 mailx 配置"
fi
fi
#!/bin/bash
NIC="ens33"
LIMIT=10 # 单位 M/s
NATLimit=10 # 限制值(用于判断)
# 取两次字节数差值,算速率
rx1=$(cat /sys/class/net/$NIC/statistics/rx_bytes)
tx1=$(cat /sys/class/net/$NIC/statistics/tx_bytes)
sleep 1
rx2=$(cat /sys/class/net/$NIC/statistics/rx_bytes)
tx2=$(cat /sys/class/net/$NIC/statistics/tx_bytes)
# 差值 -> 每秒字节数,再换算成 MB/s
rx_rate=$(( (rx2 - rx1) / 1024 / 1024 ))
tx_rate=$(( (tx2 - tx1) / 1024 / 1024 ))
#引入上行速度和下行速度
echo "上传速率: ${tx_rate} MB/s"
echo "下载速率: ${rx_rate} MB/s"
#阈值判断
#网络监控
if [[ $rx_rate -gt $NATLimit ]] || [[ $tx_rate -gt $NATLimit ]];then
title="网络监控"
desc="网络带宽告急,下行速率高达${rx_rate},上行速率高达${tx_rate}MB/s,已超过 ${LIMIT}MB/s 的限制"
echo "警告: $desc"
#发送邮件
(
echo "Subject: $title"
echo "From: system_monitor@$(hostname)"
echo "To: 1261316341@qq.com"
echo ""
echo "$desc"
echo ""
echo "监控时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "主机名: $(hostname)"
) | msmtp -a default "2654371993@qq.com" 2>/dev/null
# 检查邮件是否发送成功
if [ $? -eq 0 ]; then
echo "邮件已发送"
else
echo "邮件发送失败,请检查 msmtp 配置"
fi
fi