怎么让服务器给自己的邮箱发消息【shell脚本】

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

相关推荐
GeW3 小时前
新质生产力路线图Linux、数据库、国产化替代一次讲透
linux
aningx5 小时前
cachyos 从 GRUB 切换到 rEFInd
linux
第404号工位6 小时前
40块钱二手瘦客户端,如何跑满家庭物联网中枢?(拒绝Docker爆盘实录)
linux·架构·node.js
对象存储与RustFS6 小时前
网盘限速逼你开会员?用 RustFS 自己搭一个不限速的“私人网盘
服务器·后端·docker
骑着蜗牛撵大象3278 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
众壹新能源科技8 小时前
逆变器自带无功不够用,加装5MVar SVG后功率因数从0.85回到0.99
运维·人工智能·自动化
..Dauntless..8 小时前
【Linux】一切皆文件和缓冲区
linux·运维·服务器
裕晟资质规划8 小时前
三类资质变更报告时限差在哪?军工 15 日、集成印制 10 日
大数据·服务器·网络
QMCY_jason8 小时前
x86 ubuntu2204 无gui 安装 openeuler 2203 aarch64版本
linux·运维·服务器
重生之小比特8 小时前
【Linux系统】12 进程程序替换 自定义Shell 命令行解释器
linux·运维·服务器