怎么让服务器给自己的邮箱发消息【shell脚本】
2026/6/7 22:19:56 网站建设 项目流程

需求:编写一个监控脚本,定时检查系统的 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 秒。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询