自动化脚本防止虚拟机磁盘爆满的监控策略

2025.11.10 杂七杂八 1094
33BLOG智能摘要
你是否也曾凌晨被磁盘爆满的告警惊醒?一次疏忽就可能引发服务宕机甚至数据丢失。本文揭秘一套在生产环境中验证有效的自动化磁盘监控策略,通过一个轻量级Bash脚本,实现磁盘使用率实时检测、阈值告警与自动清理三重防护。脚本不仅支持清理过期临时文件,还能自动回收Docker占用的空间,配合systemd服务持续运行,真正做到“一次部署,长期省心”。更关键的是,作者分享了阈值设定、清理目录选择、日志追踪等实战经验,避免踩坑误删重要数据。部署后,磁盘相关运维事件直降80%!想知道如何用短短几十行脚本彻底告别磁盘空间焦虑?这套可复制的解决方案,正是每个运维人需要的“防爆”利器。
— 此摘要由33BLOG基于AI分析文章内容生成,仅供参考。

自动化脚本防止虚拟机磁盘爆满的监控策略

为什么需要磁盘监控

自动化脚本防止虚拟机磁盘爆满的监控策略

作为运维工程师,我经历过太多次凌晨被磁盘告警吵醒的噩梦。特别是在虚拟化环境中,磁盘空间不足不仅会影响业务系统运行,还可能导致数据丢失。通过自动化监控脚本,我们可以提前发现问题并自动清理,让运维工作更加从容。

监控脚本设计思路

我的监控策略主要包含三个核心环节:定期检查磁盘使用率、设置合理的阈值告警、自动执行清理操作。这样既能及时发现问题,又能避免频繁的人工干预。

实战:编写磁盘监控脚本

下面是我在实际生产环境中使用的监控脚本,支持多种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%以上。希望这个实战经验对你有帮助,记得根据实际环境调整脚本参数!

评论