需求:编写一个监控脚本,定时检查系统的 CPU 使用率,如果 CPU 使用率超过设定阈值(临界值=>90%),向指定邮箱发送警报邮件。如果 CPU 使用率恢复到正常范围内,则不发送邮件。邮件内容需包含 CPU 使用率,并且要求中文内容无乱码。

需要提前安装工具bcsendmail

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 "换成自己的邮箱"
  • \necho -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.cn

3,编写脚本

空字符串判断与正则判断

CPU使用率获取时可能出现获取不到的情况,为了避免后续判断出现异常,则可以提前判断cpu空闲率有没有获取到指定信息。

#判断cpu_idle这个变量是否为空
-z $cpu_idle

它的逻辑是:

  1. 如果 $cpu_idle 为空(比如获取失败,没拿到数据),[ -z $cpu_idle ] 的结果就是 true,会进入 if 分支执行告警或退出。
  2. 如果 $cpu_idle 不为空(正常拿到了数据),条件为 false,跳过这段判断
! "$cpu_idle" =~ ^[0-9]+(\.[0-9]+)?$

作用是:如果 $cpu_idle 不是一个合法的非负数字(整数 / 小数),就执行异常处理(比如报错、退出脚本)

使用bc进行小数判断

echo "3 > 2" |bc

bc的输出比较特殊,与$?正好相反

输出了 1,这是 bc3 > 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 秒。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐