自动获取服务器的状态(cpu、磁盘、内存),并根据设置的阈值输出消息到nginx网页文件内。

1.阈值配置(磁盘、内存、cpu、cpu监测时间范围)与nginx网页文件存储位置
2.创建等待页面,cpu监测需要记录Count_Down秒内实时监控,Count_Down参数配置
3.磁盘监控,获取对应得磁盘目录使用率。对比阈值输出信息。Monitor_message为存储消息。
4.内存监控。获取内存信息,对比阈值输出信息。Monitor_message为存储消息。
5.cpu监控,分为三种,若cpu使用率连续10秒达到100%立即停止监测输出消息,若cpu连续Count_Down秒达到阈值Cpu_Limit设置则停止并输出消息,若连续三十秒内低于90%反馈消息。cpu状态判断逻辑为,连续十秒100%内有一次非100%则清空100%计数器,阈值设置与低于90%同理。
6.输出告警信息到nginx网页文件。由于输出告警存放得Monitor_message已经存储了网页格式得消息,告警下发时只需要将信息放入即可。

#!/bin/bash

Disk_Limit=80                    #磁盘使用率阈值上限
Memory_Limit=85                 #内存使用阈值上限
Cpu_Limit=85                    #cpu使用阈值上限
Count_Down=60                   #cpu检测时间范围
Monitor_message=""               #告警数据存储
data_now=$(date +"%Y年%m月%d日%H:%M:%S")  #获取当前时间
nginx_html=/usr/local/nginx/html/index.html  #nginx网页文件

#创建等待页面,由于需要等待1分钟获取cpu状态
echo -e "<!DOCTYPE html>
<html lang=\"zh-CN\">
<head>
  <meta charset=\"UTF-8\">
  <title>服务器状态数据获取中</title>
</head>
<body>    
  <h1 id=\"countdown\"></h1>    
  <script>        
  // 设置倒计时结束时间(当前时间加上一分钟       
  var endTime = new Date();
  endTime.setSeconds(endTime.getSeconds() + $Count_Down);        
  
  // 更新倒计时函数       
  function updateCountdown() {            
	var now = new Date();            
	var timeDifference = endTime - now;           
  
  // 计算剩余时间            
  var seconds = Math.floor((timeDifference / 1000) % 60);           

  // 格式化时间并显示在页面上
  document.getElementById(\"countdown\").innerHTML = \"正在获取数据,剩余时间:\" + seconds + \" 秒,请稍等!\";            

  // 每秒更新一次            
  setTimeout(updateCountdown, 1000);      

  // 到达指定时间后刷新页面            
  if (timeDifference <= 0) {          
  location.reload();            
  }
}        
  // 初始化        
  updateCountdown();    
  </script>
</body>
</html>" > $nginx_html


###	磁盘监控
disk_monitor() {
Number_Row=`df -h | awk 'END {print NR}'` #获取所有路径多少行,为了设定循环次数
Number=`df -h` #获取磁盘信息
Monitor_message=""
for ((i=2; i<=Number_Row; i+=1))
do
 attrib=$(df -h | awk -v line=$i 'NR==line {print $5}' | cut -d'%' -f1)
 if [ $attrib -gt $Disk_Limit ];   #判断磁盘使用率是否超标
 then
 Monitor_message+="<h5 class="disk">警告: 磁盘使用率超过设定阈值$Disk_Limit%:目录$(df -h | awk -v line=$i 'NR==line {print $6}')"使用率为"$(df -h | awk -v line=$i 'NR==line {print $5}');  </h5>\n"
 else
 true
 fi
done
if [ -z "$Monitor_message" ]; then
  Monitor_message+="<p class="disk">信息: 磁盘使用率正常,未超过设置上限: $Disk_Limit%<p>\n"
else
  true
fi
}

###	内存监控
memory_monitor() {
# 获取总内存量
total_mem=$(free -m | awk 'NR==2 {print $2}')

# 获取已使用的内存量
used_mem=$(free -m | awk 'NR==2 {print $3}')

# 计算内存使用率
memory_usage=$(echo "scale=2; $used_mem / $total_mem * 100" | bc)

# 检查内存使用率是否超过阈值
if (( $(echo "$memory_usage > $Memory_Limit" | bc -l) )); then
     Monitor_message+="<h5 class="free">警告: 内存使用率超过 $Memory_Limit%。当前使用率为:$memory_usage%。</h5>\n"
else
     true
     Monitor_message+="<p class="free">信息: 内存使用率正常:当前使用率为:$memory_usage% <p>\n"
fi
}

###	cpu使用率监控
cpu_monitor() {
count_90=0
count_100=0
clean=0
while [ $Count_Down -gt 1 ];
do
cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}'| cut -d '.' -f1)
if [ $cpu_usage -eq 100 ]; then
    ((count_100++))
    clean=0
    if [ $count_100 -gt 10 ]; then
         Monitor_message+="<h5 class="cpu">警告: cpu异常,使用率达到100%持续时间超过十秒钟以上 </h5>\n"
         Count_Down=0
    else
         true
    fi
else
    count_100=0
    if [ $cpu_usage -gt $Cpu_Limit ]; then
       ((count_90++))
       clean=0
       if [ $count_90 -gt 30 ]; then
         Monitor_message+="<h5 class="cpu">警告: cpu异常,$Count_Down秒内,使用率达到设置设置上限$Cpu_Limit%持续时间超过三十秒钟以上 </h5>\n"
         Count_Down=0
       else
         true
       fi
    else
      ((clean++))
      count_90=0
      if [ $clean -gt 30 ]; then
        Monitor_message+="<p class="cpu">信息: cpu状态正常,$Count_Down秒内cpu使用率低于90%。 </p>\n"
        Count_Down=0
      else
        true
      fi
    fi
fi
sleep 1
((Count_Down--))
done
if [ $count_100 -lt 10 ] && [ $count_90 -lt 30 ] && [ $clean -lt 30 ]; then
  Monitor_message+="<p class="cpu">信息2: cpu状态正常 </p>\n"
else
  true
fi
}

###	告警下发模块
post_message() {
if [ -n "$Monitor_message" ];then
  echo -e "<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Server status</title>
    <style>
        body {
            background-size: cover;
        }
        .date {
            background-color: rgba(255, 100, 255, 0.5); /* 设置背景颜色为黄色 */
            padding: 5px; /* 可以根据需要调整内边距 */
        }
        .disk {
            background-color: rgba(255, 0, 0, 0.5); /* 设置背景颜色为黄色 */
            padding: 5px; /* 可以根据需要调整内边距 */
        }
        .free {
            background-color: rgba(255, 255, 0, 0.5); /* 设置背景颜色为黄色 */
            padding: 5px; /* 可以根据需要调整内边距 */

        }
        .cpu {
            background-color: rgba(255, 100, 0, 0.5); /* 设置背景颜色为黄色 */
            padding: 5px; /* 可以根据需要调整内边距 */
        }
    </style>
</head>
<body>
    <h3 class="date">$data_now</h3>
    ${Monitor_message[*]}
    
</body>
</html>
" > $nginx_html
else
  echo "无数据"
  true
fi
}

disk_monitor;
memory_monitor;
cpu_monitor;
post_message;

效果如下

获取状态时

nginx 挂维护页面_h5

执行结果

nginx 挂维护页面_服务器_02