必须先检查磁盘剩余空间并设置阈值熔断:用 df -B1 获取可用字节,设定安全水位线(如5GB或10%),低于则退出并告警;需预留1.5倍预估包大小,叠加 stat 与 du 双校验,并触发邮件通知,集成至定时脚本开头作为首道关卡。

检查磁盘剩余空间并设置阈值熔断
在执行打包前,必须先获取目标备份路径所在文件系统的可用空间。推荐使用 df -B1(以字节为单位)避免单位换算误差,并提取对应挂载点的 Available 值。设定一个安全水位线(如 5GB 或总容量的 10%),若可用空间低于该值,立即退出脚本并记录告警。
示例判断逻辑:
- 用 df -B1 /backup | awk 'NR==2 {print $4}' 提取可用字节数
- 将所需备份的预估大小(如 tar 包压缩后约源数据 60%,可按源目录 du -sb 估算)与可用空间比对
- 建议预留至少 1.5 倍预估包大小的空间,防止压缩过程临时膨胀或 inode 不足
集成到定时备份脚本中的安全包裹结构
把空间检查作为整个备份流程的第一道关卡,用明确的 exit 码和日志标记熔断动作。不要依赖后续命令的失败回退——压缩中途磁盘写满会导致 tar 报错、文件损坏甚至中断已运行服务。
关键结构示意:
- 开头调用空间检查函数,失败则 echo "[WARN] Insufficient space, aborting backup" >&2; logger -t backup "disk full abort"; exit 3
- 成功后才进入 tar --use-compress-program="pigz -k" -cf 等打包步骤
- 全程重定向 stderr 到日志,便于 cron 调度时捕获熔断事件
增强可靠性:加入双校验与通知机制
单靠 df 可能因 ext4 延迟分配或 root reserved blocks 导致误判。建议叠加校验:
- 用 stat -f -c "%a %b" /backup 获取可用 block 数与 block 大小,自行计算真实可用字节数
- 对即将打包的目录运行 du -sb --exclude='*.tmp' /data/to/backup | awk '{sum+=$1} END{print sum}' 得出原始数据量,再乘以保守压缩率(如 0.7)得目标包大小
- 熔断时触发轻量通知:mail -s "Backup ABORTED: low disk on $(hostname)" admin@example.com <<EOF...
适配 cron 定时与运维可观测性
在 crontab 中配置时,确保环境变量完整(尤其 PATH),并显式指定 shell 和日志路径。例如:
0 2 * * * /bin/bash /opt/scripts/backup-safe.sh >> /var/log/backup.log 2>&1
同时建议:
- 在脚本开头加 set -e -u -o pipefail 防止未定义变量或管道错误静默跳过
- 每次运行记录 start/end 时间戳及空间快照(df -h 输出截取)到日志,方便回溯容量趋势
- 配合 logrotate 归档日志,避免日志本身占满磁盘

















