需求:编写一个监控脚本,定时检查系统的 CPU 使用率,如果 CPU 使用率超过设定阈值(临界值=>90%),向指定邮箱发送警报邮件。如果 CPU 使用率恢复到正常范围内,则不发送邮件。邮件内容需包含 CPU 使用率,并且要求中文内容无乱码。
需要提前安装工具bc、sendmail
bc用于小数类型数字的计算
sendmail服务,用于向指定邮箱发送邮件
FQDN:主机名称定义规范
不能使用简单的名称作为主机名,比如node1、node2、node3
要求一般是主机功能 + 公司的域名 = FQDN
知识点解析
1,下两个小工具
dnf install bc -y dnf install sendmail -y systemctl start sendmail
bc:一款命令行下的高精度计算器工具,支持浮点数运算、脚本式计算,常用于 Shell 脚本中做数学运算
#看一下bc是否能正常使用 echo "100 - 98.5" |bc
sendmail:经典的 MTA(邮件传输代理)程序,用于在 Linux 系统中发送邮件,比如脚本的告警通知、日志报告等
#看一下sendmail是否能正常使用 echo -e "CPU使用率过载! \n 请及时关注!" | sendmail -t "换成自己的邮箱"\n是echo -e支持的换行符,所以邮件正文会分成两行显示,更易读-e就是让echo认识\n、\t这类 “反斜杠 + 字母” 的特殊格式符,并把它们变成换行、空格等效果,而不是原样输出
常用转义符(配合-e)
\n换行\t制表符(相当于按 Tab)\\输出一个反斜杠\\a响铃(嘟嘟一声)
2,主机名必须满足FQDN协议
在启动sendmail服务之前,需要更改主机名称,主机名称必须满足FQDN协议,否则会导致邮件无法发送!!! FQDN主机格式,要求:主机名称/功能 + 公司域名,web.itcast.cn、mysql.itcast.cn、node1.itcast.cn
hostnamectl set-hostname centos9.itcast.cn3,编写脚本
空字符串判断与正则判断
CPU使用率获取时可能出现获取不到的情况,为了避免后续判断出现异常,则可以提前判断cpu空闲率有没有获取到指定信息。
#判断cpu_idle这个变量是否为空 -z $cpu_idle它的逻辑是:
- 如果
$cpu_idle为空(比如获取失败,没拿到数据),[ -z $cpu_idle ]的结果就是true,会进入if分支执行告警或退出。 - 如果
$cpu_idle不为空(正常拿到了数据),条件为false,跳过这段判断
! "$cpu_idle" =~ ^[0-9]+(\.[0-9]+)?$作用是:如果$cpu_idle不是一个合法的非负数字(整数 / 小数),就执行异常处理(比如报错、退出脚本)
使用bc进行小数判断
echo "3 > 2" |bcbc的输出比较特殊,与$?正好相反
输出了1,这是bc对3 > 2这个比较表达式的判断结果:
1代表 条件为真(true),也就是3 > 2成立。- 如果条件不成立(比如
2 > 3),bc会输出0,代表 条件为假(false)
把当前 CPU 的空闲率(idle 值)提取出来,存到变量free_usage里,供后续告警脚本使用
free_usage=$(top -bn1|grep "Cpu" |tr -d ","|tr -s " " |cut -d " " -f8)top -bn1截屏一个top命令的数据管道给后面的命令
grep "Cpu" 只要带Cpu的数据
tr -d ","把逗号都删了
tr -s " "把连续空格压缩成一个空格
id前面的这个就是cpu我们把它截取出来
cut -d " " -f8 以空格为分隔符 截取第8列
完整代码
#!/bin/bash #1.定义cpu告警的阈值,一般设置为80-90,我们测试用先设置低一点,看脚本能不能跑 threshold=2 #2.设置邮箱变量,最好设置163邮箱,qq邮箱容易被判为垃圾邮箱 email=你的邮箱地址 #3.使用whi1le循环进行不间断的监控 while true do #为每条检测信息附上时间 current_time=$(date +"%F %T") free_usage=$(top -bn1|grep "Cpu" |tr -d ","|tr -s " " |cut -d " " -f8) #2,判断是否能够获得到准确的cpu空闲率 if [[ -z "$free_usage" || ! $free_usage =~ ^[0-9]+(\.[0-9]+)?$ ]];then free_usage=$(top -bn1|grep "Cpu" |tr -d ","|tr -s " " |cut -d " " -f8) fi usage=$(echo "100 - $free_usage"|bc) #由于空闲率可能存在小数,我们通告bc比较 value=$(echo "$usage > $threshold" | bc -l) if [ $value -eq 1 ]; then echo -e "CPU超阈值 \n 请检查" | sendmail -t "$email" fi done压测命令
用来给服务器做CPU 压力测试的工具
sudo dnf install stress-ng使用以下命令启动 4 个工作线程来进行 CPU 压测,每个线程会占用一个 CPU 核心
stress-ng --cpu 4 --timeout 60s--cpu 4 表示启动 4 个进程来占用 CPU,模拟 4 核的压测。
--timeout 60 表示压测持续 60 秒。