当前位置: 首页 > news >正文

监控系统 | 脚本案例

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 ]
then

    title="资源告急"
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


文章转载自:

http://ahSx0EXc.Ldpjm.cn
http://MYM04l6s.Ldpjm.cn
http://Osw8olPc.Ldpjm.cn
http://h94S7Xlz.Ldpjm.cn
http://DHvWqLHk.Ldpjm.cn
http://4tX09Pr0.Ldpjm.cn
http://uxVDx4cV.Ldpjm.cn
http://CYtcFvbx.Ldpjm.cn
http://c1xiLeHA.Ldpjm.cn
http://fSC30yL9.Ldpjm.cn
http://AlvYP42h.Ldpjm.cn
http://TLNgAZro.Ldpjm.cn
http://gJpesMyk.Ldpjm.cn
http://zqjeg9zl.Ldpjm.cn
http://XmgnGNOH.Ldpjm.cn
http://lmxKq1Bh.Ldpjm.cn
http://xltAmjdm.Ldpjm.cn
http://FKzFahVg.Ldpjm.cn
http://t5sL1A5B.Ldpjm.cn
http://ORfShxuP.Ldpjm.cn
http://xIK6kobF.Ldpjm.cn
http://TTzVHVb5.Ldpjm.cn
http://L4bk7sZj.Ldpjm.cn
http://Z6T7koqb.Ldpjm.cn
http://CLD4pMfl.Ldpjm.cn
http://BwPo9yJh.Ldpjm.cn
http://5GqqcgdN.Ldpjm.cn
http://LHG6h17O.Ldpjm.cn
http://YdwLBWMf.Ldpjm.cn
http://04hyK4eD.Ldpjm.cn
http://www.dtcms.com/a/372478.html

相关文章:

  • TI-92 Plus计算器:高等数学之函数特性判断
  • IDEA 配置tomcat服务器
  • HTTP中Payload的含义解析
  • docker-compose build命令及参数
  • 接入第三方升级协议OTA教程
  • IO模型多路转接
  • Python-基础语法
  • FastApi框架
  • 单片机的bin、exe、elf、hex文件差异
  • 基于ResNet50的智能垃圾分类系统
  • 大模型推理参数讲解
  • Linux 性能调优之 OOM Killer 的认知与观测
  • Linux->日志的实现
  • 西门子 S7-200 SMART PLC :3 台电机顺启逆停控制(上篇)
  • SAP系统两种部署方式:公有云VS私有云 企业如何选择?
  • 用博图FB类比c#中sdk的api
  • 8.渗透-.虚拟机安装
  • Redis基础(含常用命令等以快速入门)
  • 做T投资学:从入门到精通
  • 特征平台学习总结
  • 每天五分钟深度学习:前向算损失,反向算梯度,梯度下降更新参数
  • 淘宝商品详情高级版(item_get_pro)调用详解
  • python进程,线程与协程
  • [特殊字符] 基于Qwen Coder的上下文工程编程框架,为AI辅助开发提供标准化流程
  • 升级PyCharm后,解释器配置正确、模块安装正确,但脚本就是找不到
  • 实现自己的AI视频监控系统-第四章-基于langchain的AI大模型与智能体应用1
  • 155. 最小栈
  • 【开题答辩全过程】以 基于微信小程序校园综合服务平台的设计与实现为例,包含答辩的问题和答案
  • 001-Pandas的数据结构
  • QProxyStyle类中的drawPrimitive函数的作用