性能监控shell脚本编写

目录

一、配置文件别名设置

二、邮箱脚本

三、监控系统中的cpu使用率超过80%进行邮件告警

四、监控系统中的内存使用率超过80%进行邮件告警

五、监控系统中的硬盘使用率超过80%进行邮件告警

[六、监控系统中的IO await大于50进行邮件告警](#六、监控系统中的IO await大于50进行邮件告警)

七、监控系统中的网络流量下载上传超过10M(可变)进行邮件告警

八、发送报警邮箱

九、结果显示


一、配置文件别名设置

bash 复制代码
#!/bin/bash

# 配置文件路径
CONFIG_FILE="/opt/export/config.conf"
# 日志文件路径
LOG_FILE="/opt/export/resource_monitor.log"
# 错误日志文件路径
ERROR_LOG_FILE="/opt/export/resource_monitor_error.log"
# 当前时间戳(统一日志时间格式:年-月-日 时:分:秒)
CURRENT_TIME=$(date +"%Y-%m-%d %H:%M:%S")
#邮箱
mail="1239114231@qq.com"
#当前服务器
hostname=Why

# 初始化报警标志
has_alert=false
# 初始化报警信息数组
alert_messages=()

二、邮箱脚本

bash 复制代码
 vim sendemail.sh


#!/bin/bash

if [ $# -ne 3 ];then
    echo "Usage: $0 <email> <subject> <content>"
    exit 1
fi

EMAIL="$1"                      # 接收邮箱
SUBJECT="$2"                    # 标题
CONTENT="$3"                    # 内容
FROM_EMAIL="1239114231@qq.com"  # 发送邮箱
AUTH_CODE="tyyuihbgxstdbagi"    # SMTP授权
码


sendemail -f "$FROM_EMAIL" \
          -t "$EMAIL" \
          -s smtp.qq.com:587 \
          -u "$SUBJECT" \
          -m "$CONTENT" \
          -xu "$FROM_EMAIL" \
          -xp "$AUTH_CODE" \
          -o tls=yes

三、监控系统中的cpu使用率超过80%进行邮件告警

bash 复制代码
#cpu监控

check_cpu()
{
  cpu_yuzhi=80 #cpu阈值
  
  #获取cpu使用率
  cpu_use=$(top -bn1 |grep Cpu|awk '{print $2}'|cut -d. -f1)
  echo "[$CURRENT_TIME]  cpu检查结果: cpu当前使用率为$cpu_use%" >>"$LOG_FILE"

  #检查cpu使用率
  if (( $cpu_use >= $cpu_yuzhi )) ; then
    # 已使用cpu所占百分比超过阈值
    alert_msg="警告:CPU使用率超过 ${cpu_yuzhi}%,当前使用率为 ${cpu_use}%。"
    echo "$alert_msg" >&2
    echo "$CURRENT_TIME - $alert_msg" >>"$LOG_FILE"
   
    alert_messages+=("$alert_msg")
    has_alert=true
  fi
}

四、监控系统中的内存使用率超过80%进行邮件告警

bash 复制代码
#内存监控

check_Mem()
{
  Mem_yuzhi=80 #内存阈值
 
  #获取内存使用率
  Mem_use=$(free|awk '/Mem/{print int(100*$3/$2)}')
  echo "[$CURRENT_TIME]  内存检查结果:内存当前使用率为$Mem_use%" >>"$LOG_FILE"
 
  #检查内存使用率
  if (( $Mem_use >= $Mem_yuzhi )) ; then
    # 已使用内存所占百分比超过阈值
    alert_msg="警告:内存使用率超过 ${Mem_yuzhi}%,当前使用率为 ${Mem_use}%。"
    echo "$alert_msg" >&2
    echo "$CURRENT_TIME - $alert_msg" >>"$LOG_FILE"
    
    alert_messages+=("$alert_msg")
    has_alert=true
  fi
  echo "check_Mem调用成功,当前使用率为$Mem_use%"
}

五、监控系统中的硬盘使用率超过80%进行邮件告警

bash 复制代码
#磁盘监控

check_disk()
{
  yuzhi=80 #磁盘阈值
  
  #获取磁盘使用率
  use=$(df / | awk 'NR==2{print int(100*($3/$2))}')
  echo "[$CURRENT_TIME]  磁盘检查结果: / 文件系统当前使用率为$use%" >>"$LOG_FILE"
 
  #检查磁盘使用率
  if (( $use >= $yuzhi )) ; then
    # 已使用磁盘空间所占百分比超过阈值
    alert_msg="警告:根文件系统磁盘使用率超过 ${yuzhi}%,当前使用率为 ${use}%。"
    echo "$alert_msg" >&2
    echo "$CURRENT_TIME - $alert_msg" >>"$LOG_FILE"
   
    alert_messages+=("$alert_msg")
    has_alert=true
  fi
  echo "check_disk调用成功,当前使用率为$use%"
}

六、监控系统中的IO await大于50进行邮件告警

bash 复制代码
#io await 监控

check_io()
{
  io_yuzhi=50 #io阈值
 
  #获取io 使用率
  io_use=$(iostat|awk 'NR==4{print $4}'|cut -d. -f1 )
  echo "[$CURRENT_TIME]  io检查结果: 当前io await为$io_use%" >>"$LOG_FILE"
 
  #检查io 使用率
  if (( $io_use >= $io_yuzhi )) ; then
    # io await所占百分比超过阈值
    alert_msg="警告:IO Await 超过 ${io_yuzhi}ms,当前为 ${io_use}ms。"
    echo "$alert_msg" >&2
    echo "$CURRENT_TIME - $alert_msg" >>"$LOG_FILE"
    
    alert_messages+=("$alert_msg")
    has_alert=true
  fi
  echo "check_io调用成功,当前使用率为$io_use%"
}

七、监控系统中的网络流量下载上传超过10M(可变)进行邮件告警

bash 复制代码
#网络流量下载上传监控

check_net()
{
  net_yuzhi=10240 #上传下载阈值 KB/s
  
  #获取网络流量上传下载速率
  net_use_down=$(sar -n DEV 1 3|grep ens33|awk 'NR==4{print $5}'|cut -d. -f1)
  net_use_up=$(sar -n DEV 1 3|grep ens33|awk 'NR==4{print $6}'|cut -d. -f1)

  echo "[$CURRENT_TIME]  检查结果: 当前下载速率为:$net_use_down kb/s 上传速率为:$net_use_up kb/s" >>"$LOG_FILE"
 

  #检查网络流量上传下载速率
  if (( $net_use_down >= $net_yuzhi )) ; then
    # 已使用网络流量下载速率超过阈值
    alert_msg="警告:网络流量下载速率超过 ${net_yuzhi} KB/s,当前下载速率为 ${net_use_down} KB/s。"
    echo "$alert_msg" >&2
    echo "$CURRENT_TIME - $alert_msg" >>"$LOG_FILE"
   
    alert_messages+=("$alert_msg")
    has_alert=true
  fi
 
 if (( $net_use_up >= $net_yuzhi )) ; then
    alert_msg="警告:网络流量上传速率超过 ${net_yuzhi} KB/s,当前上传速率为 ${net_use_up} KB/s。"
    echo "$alert_msg" >&2
    echo "$CURRENT_TIME - $alert_msg" >>"$LOG_FILE"
    
    alert_messages+=("$alert_msg")
    has_alert=true
  fi
  echo "check_net调用成功,当前上传率为$net_use_up kb/s 下载速率为$net_use_down kb/s"
}

      

八、发送报警邮箱

bash 复制代码
# 执行所有检查
check_cpu
check_Mem
check_disk
check_io
check_net

# 输出最近10条日志
cat $LOG_FILE | tail -10

# 发送邮件 - 仅在发生报警时发送
if [ "$has_alert" = true ]; then
  echo "检测到资源超过阈值,正在发送报警邮件..."
 
  # 构建邮件内容,每个报警信息占一行
  email_content=$(printf "%s\n" "${alert_messages[@]}")
  
 # 在邮件内容前加上服务器标识
  email_content="主机: $hostname
报警时间: $CURRENT_TIME

$email_content"

  # 调用发送邮件的脚本
  # sendemail.sh 用法: ./sendemail.sh <收件人> <主题> <正文>
  /root/sendemail.sh "$mail" "[资源报警] - $hostname" "$email_content" >/dev/null 2>&1
  if [ $? -eq 0 ]; then
    echo "[$CURRENT_TIME] 报警邮件发送成功。" >> "$LOG_FILE"
  else
    echo "[$CURRENT_TIME] 错误:报警邮件发送失败!" >> "$ERROR_LOG_FILE"
  fi
else
  echo "[$CURRENT_TIME] 所有资源检查正常,无需发送报警邮件。" >> "$LOG_FILE"
  echo "所有资源检查正常。"
fi
-- 插入 --                                                                   

九、结果显示

相关推荐
fantasy_arch4 小时前
SVT-AV1编码器中实现WPP依赖管理核心调度
java·前端·av1
香香甜甜的辣椒炒肉4 小时前
vue(7)-单页应用程序&路由
前端·javascript·vue.js
高级测试工程师欧阳4 小时前
HTML 表格基础
前端
CoderJia程序员甲4 小时前
GitHub 热榜项目 - 日榜(2025-09-07)
ai·github·开源项目·github热榜
不买Huracan不改名5 小时前
安装Codex(需要用npm)
前端·npm·node.js
Dorcas_FE5 小时前
axios请求缓存与重复拦截:“相同请求未完成时,不发起新请求”
前端·spring·缓存
dreams_dream5 小时前
vue中axios与fetch比较
前端·javascript·vue.js
梦鱼5 小时前
Vue 项目图标一把梭:Iconify 自用小记(含 TS/JS 双版本组件)
前端·javascript·vue.js