运维脚本防磁盘写入失败的核心是“提前发现+自动干预+安全兜底”:开头强制校验目标分区空间,字节级判断并设1gb阈值;内嵌清理过期日志、包缓存和临时文件逻辑,逐项验证释放效果;同步检查inode使用率,针对性删小文件;记录独立日志、支持降级开关,并用sync和明确退出码保障可观测性。

运维脚本处理磁盘空间不足导致的写入报错,核心是“提前发现 + 自动干预 + 安全兜底”,不能等报错发生再响应,而要在写入前或临界点主动干预。
检查空间并中断高风险操作
脚本开头应强制校验目标分区可用空间。例如向 /var/log 写日志前,先运行:
if [ $(df -B1 /var/log | awk 'NR==2 {print $4}') -lt $((1024**3)) ]; then echo "ERROR: less than 1GB free on /var/log"; exit 1; fi- 用字节级判断(
df -B1)避免单位歧义;阈值建议设为 1GB 或按业务设定最小安全余量 - 若不满足条件,直接退出或触发清理流程,不继续执行后续写入逻辑
自动清理常见占用源
脚本内嵌轻量级清理动作,聚焦高频、低风险目录:
- 清空过期日志:
find /var/log -name "*.log" -mtime +7 -delete 2>/dev/null(保留近7天) - 清理 yum/apt 缓存:
yum clean all 2>/dev/null || apt-get clean 2>/dev/null - 清空临时目录残留:
find /tmp -type f -mmin +60 -delete 2>/dev/null(删除1小时以上临时文件) - 每项操作后加
df -h | grep '/$' | awk '{print $5}'检查释放效果,未达标可升级处理
区分 block 和 inode 资源告警
仅看 df -h 不够,必须同步检查 inode:
if [ $(df -i / | awk 'NR==2 {print $5}' | sed 's/%//') -gt 95 ]; then echo "INODE CRITICAL"; cleanup_inode_heavy_dir; fi- inode 紧张常出现在
/var/spool/mail、/var/lib/docker/overlay2或应用缓存目录,脚本可针对性清理小文件:find /path/to/cache -type f | head -n 1000 | xargs rm -f - 避免用
rm -rf直接删整个目录,优先按数量或时间筛选,防止误伤
记录与降级策略
即使清理失败,脚本也需保障基础可用性:
- 将空间状态、清理动作、剩余空间写入独立日志(如
/var/log/disk-guard.log),不依赖可能已满的默认日志路径 - 提供降级开关:检测到空间不足时,自动关闭非关键日志、跳过临时文件生成、或切换到只读模式
- 最后调用
sync并返回明确退出码(如 128 表示空间干预),供上层监控系统识别











