Linux磁盘空间需主动防控而非被动告警:①用logrotate按时间/大小双条件轮转日志;②配置journald硬性空间限制;③cron每10分钟检查/var使用率,超85%时自动清理journal、apt缓存和旧临时文件。

Linux系统不能靠“收到告警再清理”来被动响应磁盘空间问题——因为告警触发时往往已临近崩溃边缘,服务可能卡死、日志写入失败,甚至无法执行清理命令。真正可靠的做法是:**提前配置分级自动清理机制,让系统在空间使用率到达阈值前就主动干预,而不是等告警才动作。**
用logrotate实现按空间/时间双条件自动轮转
logrotate 是最稳妥的日志生命周期管理工具,支持“任一条件满足即触发”,避免日志堆积失控:
- 在 /etc/logrotate.d/your-app 中配置示例:
/var/log/myapp/*.log {
daily
size 100M
rotate 14
compress
delaycompress
missingok
notifempty
create 0644 root root
sharedscripts
postrotate
systemctl reload myapp.service 2>/dev/null || true
endscript
}- daily 和 size 100M 共存:日志满100MB或到每天零点任一条件满足即切割
- rotate 14:只保留最近14个归档(含压缩后),超期自动删除
- maxage 30(可选):即使某份日志因低频未被轮转,30天后也会强制清理
对 systemd journal 日志启用硬性空间限制
journald 默认不限制大小,极易吃光 /var 分区。必须通过配置文件设死上限,而非依赖定时脚本:
- 编辑 /etc/systemd/journald.conf,取消注释并设置:
SystemMaxUse=500M SystemKeepFree=1G MaxRetentionSec=4week
- 保存后立即生效:sudo systemctl restart systemd-journald
- 该配置确保日志总量永不突破 500MB,且始终为系统留出 1GB 空闲空间
- 无需 cron、不依赖外部脚本,journald 自动维护,安全无副作用
用 cron 主动监控 + 条件触发深度清理
当 /var 使用率超过 85% 时,自动执行一次针对性清理(作为 logrotate 和 journald 配置的兜底):
- 编写检查脚本 /usr/local/bin/check-disk-and-clean.sh:
#!/bin/bash
VAR_USAGE=$(df /var | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$VAR_USAGE" -gt 85 ]; then
# 强制收缩 journal 到 300MB
journalctl --vacuum-size=300M >/dev/null 2>&1
# 清理 apt 缓存(Debian/Ubuntu)
apt-get autoclean -y >/dev/null 2>&1
# 清理 /tmp 下 3 天前的临时文件(systemd 已接管,此为补充)
find /tmp -type f -mtime +3 -delete 2>/dev/null
fi- 赋予执行权限:chmod +x /usr/local/bin/check-disk-and-clean.sh
- 加入 crontab(每10分钟检查一次):*/10 * * * * /usr/local/bin/check-disk-and-clean.sh
关键验证与防护措施
配置完必须验证是否真起作用,防止“假清理”:
- 运行 journalctl --disk-usage 确认 journal 占用稳定在设定值内
- 手动触发一次 logrotate:logrotate -f /etc/logrotate.conf,检查 /var/log/ 下归档是否生成、旧档是否消失
- 模拟高日志写入(如 logger "test $(date)" 循环),观察空间是否受控增长
- 清理后若空间未释放,立即执行:lsof +L1 查找被进程占用的已删文件,kill 对应进程或重启服务


















