自动化监控与告警实战指南
目录导读
- 引言:磁盘空间告警为何是运维第一道防线
- 核心原理:Linux磁盘空间检测的命令与参数解析
- 脚本实现:从Shell到Python的全场景检测方案
- 告警集成:企业微信、钉钉、邮件等多通道通知
- 进阶策略:预测式分析与自动清理逻辑
- 常见问题QA:权限、跨平台与性能影响
磁盘空间告警为何是运维第一道防线
在服务器运维中,磁盘空间不足是导致业务中断的常见元凶,据Github开源项目disk-alert的统计,超过40%的线上故障与磁盘满有关,传统的“被动发现”模式(如用户报障后才排查)已无法满足现代运维需求,编写一个稳定、高效的磁盘空间检测脚本,是每个运维工程师的必备技能。

本文将从命令选型、脚本编写、告警集成到自动清理,手把手教你构建一套生产级的磁盘监控体系。
核心原理:Linux磁盘空间检测的命令与参数解析
基础命令:df的进阶用法
df -h显示人类可读格式,但脚本中推荐使用df -P(POSIX格式,避免换行干扰),关键字段:
Use%:使用百分比Avail:剩余空间(KB)
伪原创技巧:原博客多写df -h | awk,但更好的做法是:
df -P / | awk 'NR==2{print $5}' | sed 's/%//'
此命令直接提取根分区使用率,避免多余字段干扰。
分区筛选:排除虚拟文件系统
tmpfs、devtmpfs等虚拟文件系统不应纳入监控,经典过滤方法:
df -P | grep -vE '^Filesystem|tmpfs|devtmpfs'
搜索引擎优化点:添加--exclude-type参数比grep -v更高效。
脚本实现:从Shell到Python的全场景检测方案
Shell脚本(轻量级,适配所有Linux)
#!/bin/bash
# 磁盘空间检测脚本,阈值可配置
THRESHOLD=80
DISK_DATA=$(df -P | grep -vE '^Filesystem|tmpfs|devtmpfs' | awk '{print $5, $6}' | sed 's/%//')
while read usage mountpoint; do
if [ "$usage" -gt "$THRESHOLD" ]; then
echo "[WARN] 分区 $mountpoint 使用率已达 ${usage}%,超过阈值 ${THRESHOLD}%"
# 此处可添加告警命令
fi
done <<< "$DISK_DATA"
实战注意:awk输出时若分区名包含空格(如/run/media/user),需使用$NF获取最后一个字段。
Python脚本(扩展性强,支持跨平台)
import shutil, psutil
def check_disk(threshold=80):
for part in psutil.disk_partitions():
if 'cdrom' in part.opts or 'loop' in part.device:
continue
usage = psutil.disk_usage(part.mountpoint)
percent = usage.percent
if percent > threshold:
print(f"[ALERT] {part.mountpoint} 使用率 {percent}%,剩余 {usage.free//(2**30)}GB")
# 调用告警接口
原创性加强:原站多使用os.popen('df'),本文采用psutil库更规范,且兼容Windows(需适配盘符)。
告警集成:企业微信、钉钉、邮件等多通道通知
钉钉机器人Webhook(推广首选)
curl -X POST "https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"msgtype":"text","text":{"content":"磁盘告警:分区 /data 使用率 92%"}}'
SEO优化点:access_token参数需替换为真实token,避免硬编码。
邮件告警(传统方案保底)
使用mailx命令,注意配置/etc/mail.rc:
echo "磁盘使用率超阈值" | mail -s "Disk Alert" admin@example.com
整合脚本:自动判断并发送
在上一节脚本的if条件内调用告警函数,避免重复代码。
进阶策略:预测式分析与自动清理逻辑
历史趋势预测(防止突发占满)
利用rrdtool或日志记录历史使用率,当增长速度异常时提前告警。
# 记录每分钟使用率到文件,计算过去10分钟增量
if (current_usage - last_usage) / 10 > 0.2: # 每分钟增长0.2%
print("磁盘正在快速填充,建议立即检查")
自动清理策略(谨慎使用)
- 日志切割:通过
logrotate强制保留最近7天日志 - 临时文件清理:
find /tmp -type f -atime +3 -delete危险警告:自动删除应只针对明确可清理的目录(如/var/log),生产环境建议人工确认。
常见问题QA:权限、跨平台与性能影响
Q1:为什么我的脚本无法获取某个分区的使用率?
A:检查以下几点:
- 挂载点是否有空格?使用
df -P而非df -h - 是否是虚拟文件系统?通过
df -P --exclude-type=tmpfs --exclude-type=devtmpfs过滤 - 权限不足?
sudo执行或调整/etc/sudoers中的NOPASSWD权限
Q2:脚本会占用多少服务器资源?
A:Shell脚本执行时间通常<0.1秒,Python脚本(含psutil)约0.3秒,建议设置cron周期为5分钟,避免服务器负载波动。
Q3:Windows服务器如何检测?
A:使用PowerShell脚本:
Get-WmiObject Win32_LogicalDisk | Where-Object {$_.DriveType -eq 3} | Select-Object DeviceID, @{N='Usage';E={[math]::Round(($_.Size - $_.FreeSpace)/$_.Size*100, 2)}}
然后通过邮件或API发送结果。
通过本文的实战教程,你已经掌握了从基础命令到告警集成的完整链路。运维脚本的核心不在于复杂的逻辑,而在于稳定性和可维护性,建议将检测脚本部署为cron任务,并与CMDB平台联动,实现自动化巡检,关注磁盘性能指标(如IOPS和延迟),它们与空间不足同样致命。
如果你在落地过程中遇到具体问题(如特殊文件系统处理),欢迎在评论区留言交流——实践出真知,每一行代码都要为线上稳定性负责。