Linux服务器磁盘空间监控从零开始:命令、脚本与告警实战

Linux服务器磁盘空间监控从零开始:命令、脚本与告警实战

服务器磁盘一旦写满,网站可能宕机、服务无法写入日志,甚至导致系统崩溃。
对零基础用户来说,建立一套自动监控机制比每天手动登录查看更重要。
本文从最基础的命令讲起,逐步带你写好监控脚本、配置定时任务,并发送告警通知,全程可跟着操作。

1. 先学会手工检查磁盘空间

在动手写脚本前,必须会用手动命令了解当前磁盘状态。
推荐两个最常用的命令:

  • df -h:查看整个文件系统的磁盘占用,-h 表示用人类可读的单位(GB/MB)。
  • du -sh /路径:查看某个目录(如 /var/home)所占用的总空间,适合排查哪个目录在吞空间。

示例

df -h
# 输出类似:
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sda1       100G   80G   20G  80% /

如果发现某个分区使用率超过80%,就说明需要关注。记住 Use% 这一列,后面脚本也要读取这个值。

2. 写一个简单的磁盘监控脚本

目标是:当磁盘使用率超过阈值(例如90%)时,发出告警。
我们可以用 Bash 脚本实现。

在任意目录(比如 /opt/disk_monitor.sh)创建文件:

vim /opt/disk_monitor.sh

粘贴以下内容:

#!/bin/bash
# 磁盘使用率告警阈值(单位:%)
THRESHOLD=90

# 获取根分区使用率,去掉百分号
USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')

if [ $USAGE -gt $THRESHOLD ]; then
    # 这里假装发送告警,后面再对接真实发信
    echo "[警告] 根分区使用率已达到 ${USAGE}%,超过阈值 ${THRESHOLD}%。"
    # 可以追加到日志文件
    echo "$(date): 磁盘使用率 ${USAGE}%" >> /var/log/disk_alert.log
fi

解释df / 取根分区信息,awk 取出第五列就是使用率(带%),sed 去掉百分号变成纯数字,然后和阈值比较。

保存后赋予执行权限:

chmod +x /opt/disk_monitor.sh

手动测试:

/opt/disk_monitor.sh

如果当前使用率低于90%,不产生任何输出;
高于90%则会看到告警信息。
这是验证脚本是否正常的第一步。

3. 让脚本定期自动执行——配置crontab

手工检查太麻烦,用 crontab 让系统每隔一段时间自动运行脚本。
注意:crontab 有用户级别的,我们推荐用 root 用户执行监控,方便读取所有分区。

编辑 root 的 crontab:

crontab -e

(第一次使用会提示选择编辑器,选 vim 或 nano 都可以。

在文件末尾添加一行(每5分钟执行一次):

*/5 * * * * /opt/disk_monitor.sh

解读*/5 * * * * 表示每5分钟执行一次后面命令。
如果想改成每10分钟,写成 */10
如果改成每小时,写成 0 * * * *
保存退出后,crontab 会自动加载。

验证 crontab 是否生效:

crontab -l

应该能看到刚才添加的那一行。

4. 配置告警通知(邮件/钉钉机器人)

脚本里单纯输出日志还不够,我们需要真的告警。
这里介绍两种常用方式:本地邮件钉钉 Webhook

4.1 使用本地邮件发送

大部分 Linux 发行版默认安装了 mail 命令(如果没有,先 yum install mailx -yapt install mailutils -y)。
修改脚本,把告警通过邮件发给自己:

if [ $USAGE -gt $THRESHOLD ]; then
    echo "根分区使用率已达到 ${USAGE}%,请及时处理。" | mail -s "磁盘监控告警" your_email@example.com
fi

注意:如果服务器没有配置 smtp 外发,只能发给本地系统用户(例如 root),实际接收不到外部邮箱。
生产环境推荐用下面钉钉/企业微信机器人方式。

4.2 使用钉钉机器人通知(无需邮件服务器)

在钉钉群添加一个自定义 Webhook 机器人,得到一串 URL。
然后脚本里用 curl 发送 JSON 消息:

WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=你的token"

if [ $USAGE -gt $THRESHOLD ]; then
    curl -s -H "Content-Type: application/json" -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"磁盘告警:根分区使用率 ${USAGE}%\"}}" $WEBHOOK_URL
fi

保存后,再手动跑一次脚本,如果磁盘使用率确实超过阈值,钉钉群就会收到消息。这是许多运维人员推荐的做法,零成本且即时。

5. 避坑指南与高频问题

5.1 最容易漏掉的:inode 耗尽

磁盘剩余空间可能还有,但 inode(文件节点)用完了,同样无法创建新文件。
监控时应当同时检查 inode:

df -i /   # 查看根分区inode使用率

可以在脚本里增加对 df -i 的检查逻辑,阈值可以设为95%。

5.2 临时文件与日志轮转

很多磁盘满是因为 /var/log/ 下的日志没自动切割。
建议配置 logrotate 或使用宝塔面板的日志清理功能。
如果发现某个目录莫名其妙大,用 du -sh /var/log/* 定位。

5.3 脚本执行权限与被监控分区

如果监控多个分区,脚本里可以遍历 df -h 输出的行,不要只写死 /
上例为了方便基础用户只检查根分区,自己扩展时可以用 for 循环。

5.4 crontab 环境变量问题

crontab 执行脚本时可能缺少某些环境变量(如 PATH),导致 mailcurl 找不到。
建议在脚本开头加上:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

这样能避免因路径找不到命令而静默失败。

6. 效果验证:确保监控在正常工作

完成所有配置后,进行最终验证:

  1. 手动降低阈值测试:临时把脚本里的 THRESHOLD 改成比当前使用率低的值(比如10),然后执行脚本,确认是否产生告警(邮件或钉钉消息)。测试完改回真实阈值。
  2. 检查日志文件:如果脚本输出了日志,cat /var/log/disk_alert.log 查看是否有记录。
  3. 检查 crontab 是否运行grep disk_monitor /var/log/cron(某些系统 cron 日志在 /var/log/cron),看是否有执行记录。
  4. 模拟磁盘满(谨慎):可以在测试机用 dd if=/dev/zero of=/bigfile bs=1M count=100 创建一个大文件撑满磁盘,观察告警是否触发。生产环境千万别试。

如果你正在处理 Linux服务器磁盘空间监控,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
有了这套自动化监控,你不再需要每天手动敲 df -h,系统会第一时间告诉你磁盘空间紧张——这才是运维该有的状态。

分享到:
上一篇
WordPress网站链接优化实操
下一篇
Docker部署Vault从入门到实践
1
系统公告

泽御云五一特惠活动🔥

泽御云持证合规运营,资质齐全可查,长久稳定! 五一限时多重福利同步开启: ✅ 香港 2 核 2G 云服务器超值拼团,低价入手团长免费 ✅ 4 核 4G 多机房年付拼团,性价比拉满 ✅ 内蒙古新区限时 7 折(zeyuyunnmg)特惠,专属优惠码锁价续费 ✅ 全站通用 75 折优惠,老用户充值享专属赠金 官方站点:zeyuyun.com 合规资质齐全|售后有保障|活动限时错过不再有
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意