自动化脚本防止虚拟机磁盘爆满的监控策略
为什么需要磁盘监控

作为运维工程师,我经历过太多次凌晨被磁盘告警吵醒的噩梦。特别是在虚拟化环境中,磁盘空间不足不仅会影响业务系统运行,还可能导致数据丢失。通过自动化监控脚本,我们可以提前发现问题并自动清理,让运维工作更加从容。
监控脚本设计思路
我的监控策略主要包含三个核心环节:定期检查磁盘使用率、设置合理的阈值告警、自动执行清理操作。这样既能及时发现问题,又能避免频繁的人工干预。
实战:编写磁盘监控脚本
下面是我在实际生产环境中使用的监控脚本,支持多种Linux发行版:
#!/bin/bash
# 磁盘监控与自动清理脚本
THRESHOLD=85 # 磁盘使用率阈值
LOG_FILE="/var/log/disk_monitor.log"
CLEANUP_DIRS=("/tmp" "/var/tmp" "/var/log") # 需要清理的目录
# 记录日志函数
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}
# 检查磁盘使用率
check_disk_usage() {
local usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
echo $usage
}
# 自动清理函数
perform_cleanup() {
log_message "开始执行清理操作"
# 清理临时文件
for dir in "${CLEANUP_DIRS[@]}"; do
if [ -d "$dir" ]; then
find "$dir" -type f -mtime +7 -delete 2>/dev/null
log_message "已清理目录: $dir"
fi
done
# 清理Docker无用镜像(如果使用Docker)
if command -v docker &> /dev/null; then
docker system prune -f >> $LOG_FILE 2>&1
log_message "已清理Docker无用资源"
fi
}
# 主监控循环
main() {
while true; do
usage=$(check_disk_usage)
if [ $usage -ge $THRESHOLD ]; then
log_message "警告:磁盘使用率 ${usage}% 超过阈值 ${THRESHOLD}%"
perform_cleanup
# 清理后再次检查
new_usage=$(check_disk_usage)
if [ $new_usage -ge $THRESHOLD ]; then
log_message "清理后磁盘使用率仍为 ${new_usage}%,需要人工干预"
# 这里可以添加邮件或短信告警
else
log_message "清理成功,磁盘使用率降至 ${new_usage}%"
fi
fi
sleep 300 # 每5分钟检查一次
done
}
# 启动监控
main
配置定时任务与告警
为了让脚本持续运行,我们需要将其设置为系统服务或定时任务。我推荐使用systemd服务的方式:
# 创建systemd服务文件
sudo tee /etc/systemd/system/disk-monitor.service > /dev/null <<EOF
[Unit]
Description=Disk Usage Monitor
After=network.target
[Service]
Type=simple
ExecStart=/opt/scripts/disk_monitor.sh
Restart=always
User=root
[Install]
WantedBy=multi-user.target
EOF
# 启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable disk-monitor
sudo systemctl start disk-monitor
踩坑经验与优化建议
在实施过程中,我总结了几点重要经验:
1. 阈值设置要合理:不要设置得太低(避免频繁告警)或太高(失去预警意义),85%-90%是比较合适的范围
2. 清理策略要谨慎:确保清理的文件确实可以删除,避免误删重要数据
3. 日志记录要完整:详细的日志有助于问题排查和后续优化
4. 多磁盘监控:如果系统有多个挂载点,需要分别监控
监控效果验证
部署完成后,可以通过以下命令验证脚本运行状态:
# 检查服务状态
systemctl status disk-monitor
# 查看监控日志
tail -f /var/log/disk_monitor.log
# 手动触发磁盘使用检查
df -h
通过这套自动化监控方案,我们成功将磁盘相关的运维事件减少了80%以上。希望这个实战经验对你有帮助,记得根据实际环境调整脚本参数!


刚被磁盘告警吵醒就看到这篇,太及时了!