步骤 1:先定位哪里占满磁盘
# 查看磁盘分区使用率
df -h
# 进入磁盘使用率100%的挂载点,逐层看哪个目录大
du -sh *
# 只看一级目录大小
du -h –max-depth=1 /var/log
坑:df 和 du 结果不一致:大概率存在已经 rm,但进程还持有句柄的 deleted 日志。
du 看不到,但 df 统计占用。
步骤 2:区分两种情况
情况 A:大日志文件,进程没有在写(归档旧日志)
直接 rm 删除即可释放空间。
情况 B:大日志文件,进程还在持续写入(最常见)
❌禁止直接 rm。
✅正确操作:清空文件
> big-app.log
执行完,df 看磁盘空间马上释放。
如果手贱已经 rm 了活跃日志文件:
示例(不重启进程清空已删除句柄文件)
cd /proc/1234/fd
> 3
步骤 3:临时应急处理(磁盘完全写满,连创建临时文件都失败)
磁盘 100%,连创建 tmp 文件都失败:
步骤 4:根治方案(防止再次磁盘打满)
4.1 crontab 定时自动清理 7 天日志配置
1)find 命令说明
find /var/log/hadoop-yarn -type f -name "*.log*" -mtime +7 -delete
参数解释
- /var/log/hadoop-yarn:要清理的日志目录
- -type f:只匹配普通文件
- -name "*.log*":匹配日志归档文件(log.1、log‑日期.gz)
- -mtime +7:修改时间大于 7 天的文件
- -delete:直接删除
⚠️禁忌:不要匹配 *.log,这是程序正在追加写的活跃日志!只匹配切割后的归档文件。
2)编写 shell 脚本(推荐,方便调试、打日志)
/opt/scripts/clean_old_log.sh
#!/bin/bash
# 清理7天以上归档日志,禁止删除正在写入的xxx.log
LOG_DIRS=(
"/var/log/hadoop-yarn"
"/var/log/spark"
"/opt/flink/log"
)
for dir in "${LOG_DIRS[@]}"
do
if [ -d "$dir" ];then
find "$dir" -type f -name "*.log.*" -mtime +7 -delete
fi
done
赋执行权限
chmod +x /opt/scripts/clean_old_log.sh
本地先手动执行一遍测试,确认不会误删文件。
3)配置 crontab 定时任务
crontab -e
加入,每天凌晨 2 点执行清理(业务低峰)
0 2 * * * /opt/scripts/clean_old_log.sh >> /opt/scripts/clean_log_cron.log 2>&1
- 0 2 * * *:每天 02:00 运行
- >> /opt/scripts/clean_log_cron.log 2>&1:把脚本输出和错误输出记录,方便排查定时任务是否异常。
查看已配置定时任务
crontab -l
4.2 配置 logrotate 日志轮转(标准生产方案)
按文件大小 / 时间切割日志,自动压缩、自动删除 N 天前日志。避免单日志无限膨胀。
简单示例配置 /etc/logrotate.d/bizlog
/opt/app/logs/*.log {
daily
rotate 7
compress
missingok
copytruncate
}
- daily:按天切割
- rotate 7:保留 7 份历史日志
- copytruncate:复制后截断原文件,不需要重启应用,适合不能重启的服务。
1)业务程序本身配置日志级别,关闭大量 DEBUG 打印。
2)定时任务配合 find 清理归档日志(仅清理已经切割完毕的旧日志,不要处理正在写的日志)。
重要提醒:
crontab 只清理已经切割完毕的归档旧日志,绝对不要去删除应用正在持续写入的活跃日志文件,否则出现 deleted 幽灵文件,磁盘空间不释放。
活跃日志交给 logrotate;
crontab 适合清理 .log.1、.log‑20260908.gz 这类轮转后的历史归档文件。
三、对比两种根治方案
| 作用 | 日志切割、压缩、保留份数、截断原文件 | 只删除已经切割完成的旧归档文件 |
| 处理活跃日志 | ✅支持,copytruncate 模式不用重启服务 | ❌不能处理活跃日志 |
| 能力 | 完整日志治理 | 仅做旧文件删除 |
| 生产建议 | 首选必备 | 辅助,搭配 logrotate 使用 |
网硕互联帮助中心



评论前必须登录!
注册