前言 本文将介绍 CentOS 系统如何使用 Shell 脚本,实现对磁盘使用率的监控,并发送告警邮件(支持腾讯企业邮箱或者 QQ 邮箱)。
准备工作 防火墙配置 1 sudo systemctl status firewalld
1 2 3 4 5 sudo systemctl enable firewalld sudo systemctl start firewalld
1 sudo firewall-cmd --permanent --add-port=465/tcp
1 sudo firewall-cmd --reload
1 sudo firewall-cmd --list-ports
安装邮件服务 1 sudo yum install mailx -y
安装证书(普通用户或 root 用户都可以,这里使用 root 用户) 1 2 3 4 5 sudo mkdir -p /root/.certs/ sudo sh -c "echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /root/.certs/qq.crt" sudo certutil -A -n "GeoTrust SSL CA" -t "C,," -d /root/.certs -i /root/.certs/qq.crt sudo certutil -A -n "GeoTrust Global CA" -t "C,," -d /root/.certs -i /root/.certs/qq.crt sudo certutil -L -d /root/.certs
特别注意
(1) 在安装证书时,要特别注意当前使用的是哪个用户进行操作。 (2) 当使用 root 用户安装证书,那么在测试邮件发送、测试监控脚本、添加定时任务(Crontab)的时候也必须使用 root 用户。 (3) 同理,当使用普通用户安装证书,那么在测试邮件发送、测试监控脚本、添加定时任务(Crontab)的时候也建议使用普通用户。 1 2 3 4 5 6 7 8 9 10 1. 授权码: - 腾讯邮箱(包括腾讯企业邮箱和 QQ 邮箱)需要在邮箱设置中生成 SMTP 服务授权码。 - 登录邮箱,前往 设置 -> 帐号设置 -> SMTP 服务,生成授权码并使用它代替密码。 2. 安全性设置: - 确保已启用 SMTP 服务和客户端登录支持。 3. SMTP 服务器地址: - QQ 邮箱: smtp.qq.com - 腾讯企业邮箱:smtp.exmail.qq.com
编辑系统配置文件,追加以下内容(这里使用的是 QQ 邮箱) 1 2 3 4 5 6 7 8 9 10 11 12 13 sudo cp /etc/mail.rc /etc/mail.rc.bak sudo vi /etc/mail.rc set from=clay@qq.comset smtp="smtps://smtp.qq.com:465" set smtp-auth-user=clay@qq.comset smtp-auth-password=kl8jbdvxla3wt5agset smtp-auth=loginset ssl-verify=ignoreset nss-config-dir=/root/.certs
配置项 说明 set from
设置发件人的邮箱地址,邮件的 “From” 字段会显示此地址。 set smtp
指定使用腾讯邮箱的 SMTP 服务器地址和端口号(465 为 SMTPS 加密端口)。若使用的是腾讯企业邮箱,那么应该配置为 set smtp="smtps://smtp.exmail.qq.com:465"
。 set smtp-auth-user
指定用于 SMTP 身份验证的用户名,通常是发件人的完整邮箱地址。 set smtp-auth-password
指定用于 SMTP 身份验证的密码或授权码(QQ 邮箱需使用专用授权码)。 set smtp-auth
设置 SMTP 身份验证的模式为 login
,常见的认证方式之一。 set ssl-verify
忽略 SSL 证书验证(适用于证书问题或调试环境,但不建议在生产环境中忽略验证)。 set nss-config-dir
指定 NSS(Network Security Services)库的证书配置目录,用于管理 SSL/TLS 证书和加密连接。
1 sudo sh -c "echo 'TestMail~' | mail -s 'TestMail' xxx@qq.com 2>/dev/null"
1 sudo tail -f /var/log /maillog
代码实现 1 sudo vim /opt/disk_monitor.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 #!/bin/bash THRESHOLD=90 EMAIL="xxx@qq.com" DISK_DEVICE=/dev/sda1 LOG_FILE=/tmp/disk_monitor.log if [ ! -f "$LOG_FILE " ]; then touch "$LOG_FILE " fi IP_ADDRESS=$(curl -s https://checkip.amazonaws.com) if [ -n "$ip_address " ]; then IP_ADDRESS="0.0.0.0" fi ROOT_USAGE=$(df -h $DISK_DEVICE | awk 'NR==2 {print $5}' | sed 's/%//g' ) echo "$(date '+%Y-%m-%d %H:%M:%S') 检测磁盘设备: $DISK_DEVICE " >> $LOG_FILE echo "$(date '+%Y-%m-%d %H:%M:%S') 磁盘使用率: $ROOT_USAGE %" >> $LOG_FILE if [ "$ROOT_USAGE " -ge "$THRESHOLD " ]; then echo "警告: 磁盘设备 $DISK_DEVICE 的空间使用率超过 $THRESHOLD %, 请登录服务器 ($IP_ADDRESS ) 及时清理文件." | mail -s "磁盘空间告警" $EMAIL 2>/dev/null fi
1 sudo chmod 755 /opt/disk_monitor.sh
1 sudo bash /opt/disk_monitor.sh
提示
如果只希望监控根目录(/
)的磁盘使用率,可以使用命令 df -h / | awk 'NR==2 {print $5}' | sed 's/%//g'
。 如果有多个邮件接收者,可以将上述代码更改为 EMAIL="example1@qq.com, example2@qq.com
,邮箱地址之间用逗号分隔,mail
命令支持将邮件发送给 EMAIL
变量中的所有接收者。 定时检测 编辑用户的 crontab 文件(这里使用 root 用户) 添加定时任务(比如每 30 分钟执行一次磁盘使用率检测) 1 */30 * * * * /opt/disk_monitor.sh
参考资料