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

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

相关推荐
ZYH_06011 小时前
BGP策略作业
运维·服务器
zhoupenghui1681 小时前
AI大模型应用部署之Flask框架使用
运维·python·docker·容器·flask·flask框架
San813_LDD1 小时前
[操作系统]虚拟机技术
linux·windows
繁星星繁1 小时前
自动化构建-make/Makefile
运维·自动化
你是个什么橙1 小时前
安装KVM服务器、使用libvirt tools工具管理虚拟机
运维·服务器·云计算
.千余1 小时前
【C++】 String 常用操作:增删查改 | 查找 | 截取 | IO
java·服务器·开发语言·c++·笔记·学习
RisunJan1 小时前
Linux命令-parted(磁盘分区工具)
linux·运维
艾莉丝努力练剑1 小时前
【QT】界面优化:QSS
linux·运维·开发语言·网络·qt·计算机网络·udp
一只积极向上的小咸鱼1 小时前
TOML、JSON、YAML、INI 配置文件格式总结
java·服务器·json