自动获取服务器的状态(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;
效果如下
获取状态时
执行结果