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 -y 或 apt 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),导致 mail 或 curl 找不到。
建议在脚本开头加上:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
这样能避免因路径找不到命令而静默失败。
6. 效果验证:确保监控在正常工作
完成所有配置后,进行最终验证:
- 手动降低阈值测试:临时把脚本里的
THRESHOLD改成比当前使用率低的值(比如10),然后执行脚本,确认是否产生告警(邮件或钉钉消息)。测试完改回真实阈值。 - 检查日志文件:如果脚本输出了日志,
cat /var/log/disk_alert.log查看是否有记录。 - 检查 crontab 是否运行:
grep disk_monitor /var/log/cron(某些系统 cron 日志在/var/log/cron),看是否有执行记录。 - 模拟磁盘满(谨慎):可以在测试机用
dd if=/dev/zero of=/bigfile bs=1M count=100创建一个大文件撑满磁盘,观察告警是否触发。生产环境千万别试。
如果你正在处理 Linux服务器磁盘空间监控,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
有了这套自动化监控,你不再需要每天手动敲 df -h,系统会第一时间告诉你磁盘空间紧张——这才是运维该有的状态。