CentOS 通过 Shell 脚本实现磁盘监控报警

前言

本文将介绍 CentOS 系统如何使用 Shell 脚本,实现对磁盘使用率的监控,并发送告警邮件(支持腾讯企业邮箱或者 QQ 邮箱)。

准备工作

防火墙配置

  • 检查当前防火墙状态
1
sudo systemctl status firewalld
  • 如果防火墙未运行,可以启动它
1
2
3
4
5
# 开机自动启动
sudo systemctl enable firewalld

# 启动防火墙
sudo systemctl start firewalld
  • 防火墙开放 465 端口
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.com
set smtp="smtps://smtp.qq.com:465"
set smtp-auth-user=clay@qq.com
set smtp-auth-password=kl8jbdvxla3wt5ag
set smtp-auth=login
set ssl-verify=ignore
set 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 证书和加密连接。
  • 测试邮件发送(这里使用 root 用户)
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
IP_ADDRESS=$(curl -s https://checkip.amazonaws.com)

# 判断服务器的公网 IP 是否为空
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
  • 脚本测试执行(这里使用 root 用户)
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 用户)
1
sudo crontab -e
  • 添加定时任务(比如每 30 分钟执行一次磁盘使用率检测)
1
*/30 * * * * /opt/disk_monitor.sh

参考资料