文档首页> IDC服务> Linux脚本实现文件系统使用率大于90%报警

Linux脚本实现文件系统使用率大于90%报警

发布时间:2025-12-01 00:11       

想要在磁盘快被写满之前就收到提醒,本质上就是做一个文件系统使用率监控告警脚本,配合定时任务跑起来即可 🚨。下面直接给出可落地方案,并把每一段脚本讲清楚。


一、思路拆解(先把脑子理顺)

  1. 使用 df 获取各个文件系统的使用率。
  2. 通过 <span style="color:red;">awk</span> 只取“使用率”和“挂载点”两个字段。
  3. 把使用率里的 % 去掉,转换成数字。
  4. 判断是否 ≥ 90%,如果超了就写日志并可选发送邮件。
  5. 配合 <span style="color:red;">cron</span> 定时执行,实现自动告警。

二、完整告警脚本示例(检查 > 90%)

假设脚本路径:/usr/local/sbin/check_fs_usage.sh

#!/bin/bash

THRESHOLD=90
ALERT_LOG="/var/log/fs_usage_alert.log"
EMAIL="admin@example.com"

df -P -x tmpfs -x devtmpfs | awk 'NR>1 {print $(NF-1), $NF}' | while read usage mount; do
  usep=${usage%%%}
  if [ "$usep" -ge "$THRESHOLD" ]; then
    msg="[$(date '+%F %T')] 文件系统 $mount 使用率已达 ${usep}% (阈值 ${THRESHOLD}%)"
    echo "$msg" >> "$ALERT_LOG"
    # 如果系统已配置邮件服务,可取消下一行注释启用邮件告警
    # echo "$msg" | mail -s "磁盘使用率告警:$mount" "$EMAIL"
  fi
done
​

脚本逐段解释(每一部分都说清楚) ✅

  1. #!/bin/bash

    • 指定脚本由 <span style="color:red;">/bin/bash</span> 解释执行,确保在多数 Linux 发行版上行为一致。
  2. THRESHOLD=90
    ALERT_LOG="/var/log/fs_usage_alert.log"
    EMAIL="admin@example.com"
    ​
    • THRESHOLD=90:设置告警阈值为 90,表示使用率 ≥ 90% 就触发告警。如果你想更激进,可以改成 80。
    • ALERT_LOG="...":指定告警日志文件路径,所有告警信息都会追加写入这个文件,便于后续审计和排查。
    • EMAIL="admin@example.com":告警接收邮箱地址,只有在你启用邮件那行并且系统已配置好邮件服务时才会真正发邮件。
  3. df -P -x tmpfs -x devtmpfs | awk 'NR>1 {print $(NF-1), $NF}' | while read usage mount; do
    ​
    • df -P:使用 POSIX 格式输出磁盘使用情况,保证字段列固定,方便后面用 awk 处理。
    • -x tmpfs -x devtmpfs:排除 <span style="color:red;">tmpfs</span>、<span style="color:red;">devtmpfs</span> 这类内存伪文件系统,它们不是真实磁盘,满了也不会是你最关心的业务风险。
    • | awk 'NR>1 {print $(NF-1), $NF}':
      • NR>1:跳过第一行表头,从第二行开始处理。
      • $(NF-1):取倒数第二列(使用率,例如 92%)。
      • $NF:取最后一列(挂载点,例如 /、/data)。
      • 最终输出形如 92% /data 的两列数据。
    • | while read usage mount; do:把上一条命令的输出逐行读入,前一列赋给变量 usage(如 92%),后一列赋给 mount(如 /data),进入循环逐个文件系统检查。
  4. usep=${usage%%%}
    ​
    • usage 的值类似 92%,包含百分号。
    • ${usage%%%}:使用 shell 字符串操作,去掉末尾的 % 字符,得到纯数字 <span style="color:red;">92</span>,方便后面用整数比较。
  5. if [ "$usep" -ge "$THRESHOLD" ]; then
    ​
    • 使用 [ 进行整数比较:
      • -ge 表示 “greater or equal(大于等于)”。
      • 当 usep(实际使用率)≥ THRESHOLD(阈值)时进入告警逻辑。
    • 这里用 -ge 而不是 -gt,是为了让“刚好 90%”也能触发告警,减少风险。
  6. msg="[$(date '+%F %T')] 文件系统 $mount 使用率已达 ${usep}% (阈值 ${THRESHOLD}%)"
    echo "$msg" >> "$ALERT_LOG"
    ​
    • $(date '+%F %T'):生成当前时间戳,例如 2025-11-29 10:30:12。
    • msg="...":拼出一条完整的告警信息,包含时间、挂载点、当前使用率、阈值,方便后续分析“什么时候开始爆的盘”。
    • echo "$msg" >> "$ALERT_LOG":把告警信息追加写入日志文件,不会覆盖旧记录,便于长期追踪磁盘健康情况 📊。
  7. (可选邮件部分)

    # echo "$msg" | mail -s "磁盘使用率告警:$mount" "$EMAIL"
    ​
    • 这一行默认是注释,避免你机器上还没有配置邮件服务就直接报错。
    • 含义是:把 msg 作为邮件正文,通过 mail 命令发送,标题为“磁盘使用率告警:挂载点”,收件人是前面配置的 EMAIL。
    • 如果你的系统已正确配置邮件发送(如 mailx + 本地 MTA 或中继),去掉这一行前面的 # 即可启用邮件告警 ✉️。
  8. fi
    done
    ​
    • fi:结束 if 条件块。
    • done:结束 while 循环。整个脚本会把所有真实磁盘挂载点检查一遍。

三、定时执行:用 cron 让告警真正“自动化” ⏰

编辑当前用户的定时任务(常用于 root 用户):

crontab -e