Linux 上監控磁碟空間並自動告警 文章首圖

Linux 上監控磁碟空間並自動告警

Linux 上監控磁碟空間並自動告警

在 Linux 系統管理的日常工作中,磁碟空間不足是一個既常見又致命的問題。當 /var 目錄因日誌寫滿而導致服務中斷,或是根目錄 / 空間耗盡引發資料庫寫入失敗時,系統往往已經處於不穩定狀態。對於中階 Linux 使用者而言,依賴人工定期檢查 df -h 不僅效率低落,更難以在第一時間發現異常。

本文将介绍如何构建一个轻量级、自动化的磁盘空间监控方案。我们将结合 Linux 原生的 cron 定时任务与简单的 Shell 脚本,实现当磁盘使用率超过设定阈值时,自动发送电子邮件告警。此方案无需安装复杂的监控软件(如 Zabbix 或 Prometheus),适合中小规模服务器或独立主机使用。

前置准备:配置邮件发送功能

要实现告警,首先必须确保系统能够发送邮件。在 Ubuntu 22.04 或 Debian 12 中,推荐使用 msmtp 配合 mutt,或者直接使用 mailutils。为了简化配置,我们这里演示使用 mailutils 配合 Gmail SMTP 的方式(请替换为您的实际邮箱信息)。

首先安装必要的软件包:

sudo apt update
sudo apt install -y mailutils msmtp msmtp-mta

接着,我们需要配置 msmtp 以连接邮件服务器。编辑配置文件 /etc/msmtprc

sudo nano /etc/msmtprc

在文件中添加以下内容(以 Gmail 为例,需先在 Google 账号中开启“应用专用密码”):

defaults
auth on
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt

account default
host smtp.gmail.com
port 587
from your_email@gmail.com
user your_email@gmail.com
password your_app_password

account default : default

注意:请务必修改文件权限,防止密码泄露:

sudo chmod 600 /etc/msmtprc

测试邮件发送是否正常:

echo "Test email from Linux server" | mail -s "Test Subject" recipient@example.com

如果收件箱收到测试邮件,说明邮件通道已打通。

编写磁盘监控脚本

接下来,我们创建一个 Shell 脚本,用于扫描所有挂载点并检查使用率。

/usr/local/bin/ 目录下创建脚本 disk_monitor.sh

sudo nano /usr/local/bin/disk_monitor.sh

输入以下代码:

#!/bin/bash

# 配置区域
THRESHOLD=80          # 告警阈值百分比
RECIPIENT="your_email@gmail.com"  # 接收告警的邮箱
SUBJECT="Alert: Disk Usage High on $(hostname)"
BODY="The following partitions are using more than ${THRESHOLD}% space:\n"

# 获取磁盘使用情况,排除 tmpfs, devtmpfs, squashfs 等虚拟文件系统
df -H | grep -E "^/dev/" | awk '{print $5, $6}' | while read usage mountpoint; do
    # 去除百分号并转换为整数进行比较
    usage_num=${usage%\%}

    if [ "$usage_num" -ge "$THRESHOLD" ]; then
        BODY="${BODY}\n${mountpoint}: ${usage} used"
    fi
done

# 如果发现有空间不足的分区,则发送邮件
if [ "$(echo -e "$BODY" | wc -l)" -gt 2 ]; then
    echo -e "$BODY" | mail -s "$SUBJECT" "$RECIPIENT"
fi

赋予脚本执行权限:

sudo chmod +x /usr/local/bin/disk_monitor.sh

你可以手动运行一次脚本,检查邮件是否正常发出,以及输出格式是否符合预期。

配置定时任务自动执行

为了让监控持续生效,我们需要使用 cron 定期执行该脚本。例如,每 6 小时检查一次。

编辑当前用户的 crontab(建议使用 root 用户执行,以监控所有挂载点):

sudo crontab -e

在文件末尾添加以下行:

0 */6 * * * /usr/local/bin/disk_monitor.sh

这表示每小时的第 0 分钟(即整点)执行一次脚本。对于大多数场景,每天检查 4 次(每 6 小时一次)足以平衡实时性与系统负载。如果你希望更频繁地监控,可以调整为每 1 小时执行一次 0 * * * *

常见问题与排查

1. 邮件发送失败或进入垃圾邮件箱

许多服务器 IP 被邮件服务商列入黑名单,导致邮件无法送达。

  • 解决方案:检查 /var/log/mail.log 查看错误信息。如果使用 Gmail,确保使用的是“应用专用密码”而非登录密码。对于生产环境,建议配置企业级 SMTP 服务(如 SendGrid 或 AWS SES)或使用本地 Postfix 配合 DNS 解析。

2. 告警过于频繁导致邮件轰炸

如果磁盘使用率持续高于阈值,每次 cron 执行都会发送邮件,可能导致邮箱爆满。

  • 解决方案:可以在脚本中加入状态文件记录上次告警时间。例如,仅在磁盘使用率首次超过阈值或变化幅度较大时发送告警。或者,在 cron 中设置更长的检查间隔,并在脚本中增加去重逻辑。

3. 虚拟文件系统误报

df 命令会列出所有文件系统,包括 /dev/shm 等临时文件系统,这些空间通常很大且无需监控。

  • 解决方案:在脚本的 df 命令中,务必使用 grep -E "^/dev/"df -x tmpfs -x devtmpfs -x squashfs 来排除这些虚拟文件系统,只关注实际物理存储。

小結

通过上述步骤,我们成功构建了一个轻量级的 Linux 磁盘空间监控与告警系统。这套方案的核心优势在于其极简的依赖关系和易于维护的特点。虽然它不具备 Zabbix 等重型监控工具的历史趋势分析功能,但对于大多数中小规模的基础设施而言,这种“阈值告警”机制足以应对 90% 以上的磁盘空间突发问题。

建议使用者定期审查告警邮件,并配合 du -sh /* 等命令快速定位大文件,形成“监控-告警-排查”的完整运维闭环。随着系统复杂度的增加,您可以在此基础上扩展监控维度,例如增加 inode 使用率监控或关键目录的文件数量监控,进一步提升系统的稳定性。