当前位置: 首页 > news >正文

使用Shell脚本实现Linux系统资源监控邮件告警

前言

1. 问题背景与需求

2. Bash 脚本监控资源

3. Bash 脚本判断阈值

4. 配置 msmtp 发送邮件

4.1 安装 msmtp

4.2 创建配置文件 /etc/msmtprc

5. 发送邮件

5.1 给别人发邮件

6. 完整示例脚本

7. 测试方法

8. 常见问题解答

9. 总结

前言

在运维过程中,监控服务器的 CPU、内存和磁盘使用率非常重要。当资源使用率过高时,及时收到邮件告警可以避免服务中断。本文将结合实践,详细讲解如何用 Bash 脚本监控系统资源,并通过 msmtp 发送邮件告警。


1. 问题背景与需求

  • 监控目标

    • CPU 使用率

    • 内存使用率

    • 磁盘使用率

  • 告警条件:当任意资源使用率超过阈值时发送邮件

  • 邮件需求

    • 发送到指定收件人(自己或他人邮箱)

    • 邮件包含主题和正文

    • 邮件通过自己的 SMTP 账户发送(例如 QQ 邮箱)


2. Bash 脚本监控资源

获取系统资源使用率的常用命令如下:

# CPU 使用率 
cpu_use=$(top -bn1 | grep "Cpu(s)" | awk -F, '{print 100 - $4}' | awk -F. '{print $1}')

说明

  • top -bn1:以批处理模式(非交互)输出一次 CPU 和内存状态

  • grep "Cpu(s)":筛选包含 CPU 信息的行

  • awk -F, '{print 100 - $4}'$4%id(CPU 空闲百分比),用 100 - $4 计算 CPU 使用率

  • awk -F. '{print $1}':取整数部分,方便比较阈值

# 内存使用率
mem_use=$(free | awk '/Mem/{print $3/$2 * 100}' | awk -F. '{print $1}')

说明

  • free:显示内存使用情况

  • awk '/Mem/{print $3/$2 * 100}'$3 是已用内存,$2 是总内存,计算百分比

  • awk -F. '{print $1}':取整数部分

# 根目录磁盘使用率disk_use=$(df / | awk 'END{print $5}' | sed 's/%//')

说明

  • df /:查看根目录分区使用情况

  • awk 'END{print $5}':取最后一行(分区行)的第五列(使用率)

  • sed 's/%//':去掉百分号,方便比较


3. Bash 脚本判断阈值

设置阈值,并将告警信息拼接到变量 ALERT_MSG

CPU_WARNING=80 
MEM_WARNING=80 
DISK_WARNING=80 
ALERT_MSG="" 
# CPU告警判断
if [ "$cpu_use" -ge "$CPU_WARNING" ]; then 
ALERT_MSG+="CPU使用率:${cpu_use}%超过阈值${CPU_WARNING}%\n" 
fi

说明

  • [ "$cpu_use" -ge "$CPU_WARNING" ]:判断 CPU 是否大于等于阈值

  • ALERT_MSG+=:追加告警信息

  • \necho -e 输出时换行

    类似逻辑用于内存和磁盘判断。


4. 配置 msmtp 发送邮件

4.1 安装 msmtp

# CentOS/RHEL 
sudo yum install msmtp -y 
# Ubuntu/Debian
sudo apt install msmtp -y 

说明

  • msmtp 是轻量级 SMTP 客户端

  • 支持管道输入,将文本内容发送为邮件正文

4.2 创建配置文件 /etc/msmtprc

defaults 
auth on # 开启认证 
tls on # 开启 TLS 加密 
tls_trust_file /etc/ssl/certs/ca-bundle.crt # CA 证书路径 
logfile /var/log/msmtp.log # 日志文件 account qq 
host smtp.qq.com # SMTP 服务器地址 
port 587 # SMTP 端口 
from 3426848201@qq.com # 发件人邮箱 
user 3426848201@qq.com # SMTP 用户名 
password zqhvzueytjhncjae # SMTP 授权码 account default : qq # 默认账户

说明

  • 日志文件使用绝对路径,避免 ~ 不被解析

  • 权限必须设置为 600:chmod 600 /etc/msmtprc

  • account default : qq 表示默认发送账户


5. 发送邮件

msmtp 需要在邮件内容里写主题:

if [ -n "$ALERT_MSG" ]; then ( echo "Subject: 服务器资源告警" echo # 空行,分隔邮件头和正文 echo -e "$ALERT_MSG" # 邮件正文 ) | msmtp "$MAIL_TO" 
fi

说明

  • if [ -n "$ALERT_MSG" ]:仅当有告警信息时发送邮件

  • echo "Subject: ...":邮件主题

  • echo:空行分隔邮件头和正文

  • echo -e "$ALERT_MSG":输出正文,支持换行


5.1 给别人发邮件

MAIL_TO="friend@example.com" ( echo "From: 3426848201@qq.com" echo "To: friend@example.com" echo "Subject: 服务器资源告警" echo echo -e "$ALERT_MSG" ) | msmtp -t

说明

  • -t 告诉 msmtp 从邮件头读取收件人

  • 可以一次发给多人,用逗号或空格隔开


6. 完整示例脚本

#!/bin/bash
#系统资源监控脚本#配置邮箱信息
MAIL_TO="3426848201@qq.com" #收件人邮箱#邮件标题
TITLE="服务器资源告警"#获取CPU使用率
cpu_use=$(top -bn1 | grep "Cpu(s)" | awk -F, '{print 100 - $4}' | awk -F. '{print $1}')
#获取磁盘使用率
disk_use=$(df / | awk 'END{print $5}' | sed 's/%//')
#获取内存使用率
mem_use=$(free | awk '/Mem/{print $3/$2 * 100}' | awk -F. '{print $1}')#设置告警阈值
CPU_WARNING=1
MEM_WARNING=1
DISK_WARNING=1#用于保存监控信息
ALERT_MSG=""#判断CPU
if [ "$cpu_use" -ge "$CPU_WARNING" ]; thenALERT_MSG+="CPU使用率:${cpu_use}%超过阈值${CPU_WARNING}%\n"
fi
#判断内存
if [ "$mem_use" -ge "$MEM_WARNING" ]; thenALERT_MSG+="内存使用率:${mem_use}%超过阈值${MEM_WARNING}%\n"
fi
#判断磁盘
if [ "$disk_use" -ge "$DISK_WARNING" ]; thenALERT_MSG+="磁盘使用率:${disk_use}%超过阈值${DISK_WARNING}%\n"
fi#如果有告警就发邮件
if [ -n "$ALERT_MSG" ]; then(echo "Subject: $TITLE"echoecho -e "$ALERT_MSG") | msmtp "$MAIL_TO"
fi

7. 测试方法

  1. 将阈值调低,例如 1%,确保告警触发

  2. 执行脚本:

   sh Cpu内存监控.sh
  1. 检查收件邮箱,确认主题和正文显示正确

注意:可使用crontab -e

     */5  *  *  *  *  /bin/bash  /path(脚本路径)/shname.sh(脚本名)

实现全自动监控,如遇执行失败,请检查脚本是否有执行权限,没有可用chmod提权


8. 常见问题解答

问题原因解决方法
收到空邮件$ALERT_MSG 为空,或邮件头和正文没有空行确保告警信息非空,邮件头与正文间加空行
收到无主题邮件msmtp 不会自动加主题在邮件内容第一行写 Subject:
msmtp: input error配置文件有语法错误或使用 ~使用绝对路径、保持 Unix 换行格式、权限 600
无法发送邮件SMTP 配置错误确认 hostportuserpassword 正确,使用授权码

9. 总结

  • Bash + msmtp 可以实现轻量级系统资源监控邮件告警

  • 邮件头、主题和正文必须正确,否则收件人可能看到空邮件或无主题

  • 可以扩展支持多收件人、日志记录和定时任务


文章转载自:

http://gBZLHoYh.fqfkx.cn
http://yqHN246i.fqfkx.cn
http://4cCkndEE.fqfkx.cn
http://d7IrXlhl.fqfkx.cn
http://gSlNAdYU.fqfkx.cn
http://6PclRKUT.fqfkx.cn
http://zjkOYzPA.fqfkx.cn
http://0SK38XcV.fqfkx.cn
http://IYNBOwhH.fqfkx.cn
http://ZR66xBNc.fqfkx.cn
http://sbKnQ99D.fqfkx.cn
http://A0JqpJ1G.fqfkx.cn
http://ZFvo0pLa.fqfkx.cn
http://9TFrgWSi.fqfkx.cn
http://ehGQNlGU.fqfkx.cn
http://ox9MV1yC.fqfkx.cn
http://V2Qmk03X.fqfkx.cn
http://G9zRAU6m.fqfkx.cn
http://YHaF0V2x.fqfkx.cn
http://mkpM0DQA.fqfkx.cn
http://mCXzFfnv.fqfkx.cn
http://8LZ6n5IV.fqfkx.cn
http://wE8xoPMG.fqfkx.cn
http://2MjLd3Qq.fqfkx.cn
http://mXmRX8Cs.fqfkx.cn
http://vjTPvOh2.fqfkx.cn
http://kTMRPWM4.fqfkx.cn
http://V83vHEAY.fqfkx.cn
http://hcIgHZuY.fqfkx.cn
http://aTRTm8Zg.fqfkx.cn
http://www.dtcms.com/a/370290.html

相关文章:

  • 提示词工程知识积累及分析
  • Excel 表格 - Excel 收起与展开工具栏
  • ElemenetUI之常用小组件
  • 【c++】函数重载
  • 算法复杂度分析:从理论基础到工程实践的系统认知
  • Java-118 深入浅出 MySQL ShardingSphere 分片剖析:SQL 支持范围、限制与优化实践
  • 小智医疗:Java大模型应用项目全流程实战
  • DeepSeek辅助在64位Linux中编译运行32位的asm-xml-1.4程序
  • Claude 中国禁用后,阿里 1T 参数模型 Qwen3-Max 连夜发布,效果太强了
  • C++并发编程指南 std::promise 介绍与使用
  • 使用函数调用对整形数组进行排序
  • Linux bzip2 命令使用说明
  • python打包工具setuptools
  • 屏幕小管家——图像识别自动操作助手
  • hbuilderX的gite项目怎么看项目地址
  • 【MFC】对话框节点属性:Language(语言)
  • 联邦学习论文分享:Towards Building the Federated GPT:Federated Instruction Tuning
  • 【Neovim】Vi、Vim、Neovim 与 LazyVim:发展史
  • Eigen中Eigen::Affine3d和Eigen::Isometry3d详解
  • 得物前端二面面经总结
  • 如何离线安装 VirtualMachinePlatform
  • Redisson分布式事务锁
  • 浪潮CD1000-移动云电脑-RK3528芯片-2+32G-安卓9-2种开启ADB ROOT刷机教程方法
  • 详解文件操作
  • 网络通信 IO 模型学习总结基础强化
  • 分布式go项目-搭建监控和追踪方案
  • python炒股
  • SpringBoot01-配置文件
  • 深度学习——数据增强(Data Augmentation)
  • 【Python自动化】 21.1 Pandas 读取 Excel 文件的完整指南