前言
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+=
:追加告警信息 -
\n
在echo -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%
,确保告警触发 -
执行脚本:
sh Cpu内存监控.sh
-
检查收件邮箱,确认主题和正文显示正确
注意:可使用crontab -e
*/5 * * * * /bin/bash /path(脚本路径)/shname.sh(脚本名)
实现全自动监控,如遇执行失败,请检查脚本是否有执行权限,没有可用chmod提权
8. 常见问题解答
问题 | 原因 | 解决方法 |
---|---|---|
收到空邮件 | $ALERT_MSG 为空,或邮件头和正文没有空行 | 确保告警信息非空,邮件头与正文间加空行 |
收到无主题邮件 | msmtp 不会自动加主题 | 在邮件内容第一行写 Subject: |
msmtp: input error | 配置文件有语法错误或使用 ~ | 使用绝对路径、保持 Unix 换行格式、权限 600 |
无法发送邮件 | SMTP 配置错误 | 确认 host 、port 、user 、password 正确,使用授权码 |
9. 总结
-
Bash + msmtp 可以实现轻量级系统资源监控邮件告警
-
邮件头、主题和正文必须正确,否则收件人可能看到空邮件或无主题
-
可以扩展支持多收件人、日志记录和定时任务