步骤 1:先定位哪里占满磁盘 1 2 3 4 5 6 # 查看磁盘分区使用率 df -h # 进入磁盘使用率100%的挂载点,逐层看哪个目录大 du -sh * # 只看一级目录大小 du -h --max-depth=1 /var/log 坑:df和du结果不一致:大
步骤 1:先定位哪里占满磁盘
坑:df 和 du 结果不一致:大概率存在已经 rm,但进程还持有句柄的 deleted 日志。 du 看不到,但 df 统计占用。 步骤 2:区分两种情况情况 A:大日志文件,进程没有在写(归档旧日志)直接 rm 删除即可释放空间。 情况 B:大日志文件,进程还在持续写入(最常见)禁止直接 rm。 正确操作:清空文件
执行完,df 看磁盘空间马上释放。 如果手已经 rm 了活跃日志文件:
示例(不重启进程清空已删除句柄文件)
步骤 3:临时应急处理(磁盘完全写满,连创建临时文件都失败)磁盘 100%,连创建 tmp 文件都失败:
步骤 4:根治方案(防止再次磁盘打满)4.1 crontab 定时自动清理 7 天日志配置1)find 命令说明
参数解释
禁忌:不要匹配 *.log,这是程序正在追加写的活跃日志!只匹配切割后的归档文件。 2)编写 shell 脚本(推荐,方便调试、打日志)/opt/scripts/clean_old_log.sh
赋执行权限
本地先手动执行一遍测试,确认不会误删文件。 3)配置 crontab 定时任务
加入,每天凌晨 2 点执行清理(业务低峰)
查看已配置定时任务
4.2 配置 logrotate 日志轮转(标准生产方案)按文件大小 / 时间切割日志,自动压缩、自动删除 N 天前日志。避免单日志无限膨胀。 简单示例配置 /etc/logrotate.d/bizlog
1)业务程序本身配置日志级别,关闭大量 DEBUG 打印。 2)定时任务配合 find 清理归档日志(仅清理已经切割完毕的旧日志,不要处理正在写的日志)。 重要提醒: crontab 只清理已经切割完毕的归档旧日志,绝对不要去删除应用正在持续写入的活跃日志文件,否则出现 deleted 幽灵文件,磁盘空间不释放。 活跃日志交给 logrotate; crontab 适合清理 .log.1、.log?20260908.gz 这类轮转后的历史归档文件。 三、对比两种根治方案
|
2024-04-02
2024-02-26
2023-01-24
2024-09-30
2022-08-15