广告位联系
返回顶部
分享到

linux磁盘满了怎么清理?df与du不一致的原因和解决方法

linux 来源:互联网 作者:佚名 发布时间:2026-09-09 22:27:28 人浏览
摘要

步骤 1:先定位哪里占满磁盘 1 2 3 4 5 6 # 查看磁盘分区使用率 df -h # 进入磁盘使用率100%的挂载点,逐层看哪个目录大 du -sh * # 只看一级目录大小 du -h --max-depth=1 /var/log 坑:df和du结果不一致:大

步骤 1:先定位哪里占满磁盘

1

2

3

4

5

6

# 查看磁盘分区使用率

df -h

# 进入磁盘使用率100%的挂载点,逐层看哪个目录大

du -sh *

# 只看一级目录大小

du -h --max-depth=1 /var/log

坑:df 和 du 结果不一致:大概率存在已经 rm,但进程还持有句柄的 deleted 日志。

du 看不到,但 df 统计占用。

步骤 2:区分两种情况

情况 A:大日志文件,进程没有在写(归档旧日志)

直接 rm 删除即可释放空间。

情况 B:大日志文件,进程还在持续写入(最常见)

禁止直接 rm。

正确操作:清空文件

1

> big-app.log

执行完,df 看磁盘空间马上释放。

如果手已经 rm 了活跃日志文件:

  1. lsof |grep deleted 找到 PID
  2. 业务允许:重启对应服务进程,释放句柄,磁盘释放。
  3. 业务不能重启:进入该文件的 /proc/<pid>/fd/ 目录,找到对应 fd,执行 > fd编号 清空文件,不用重启进程。

示例(不重启进程清空已删除句柄文件)

1

2

cd /proc/1234/fd

> 3

步骤 3:临时应急处理(磁盘完全写满,连创建临时文件都失败)

磁盘 100%,连创建 tmp 文件都失败:

  1. 优先清空大的活跃日志 > xxx.log,不要产生新文件;
  2. 如果有老旧归档日志,可以 rm 删除;
  3. 应急之后,必须根治,不能每次手动清理。

步骤 4:根治方案(防止再次磁盘打满)

4.1 crontab 定时自动清理 7 天日志配置

1)find 命令说明

1

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#!/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

赋执行权限

1

chmod +x /opt/scripts/clean_old_log.sh

本地先手动执行一遍测试,确认不会误删文件。

3)配置 crontab 定时任务

1

crontab -e

加入,每天凌晨 2 点执行清理(业务低峰)

1

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:把脚本输出和错误输出记录,方便排查定时任务是否异常。

查看已配置定时任务

1

crontab -l

4.2 配置 logrotate 日志轮转(标准生产方案)

按文件大小 / 时间切割日志,自动压缩、自动删除 N 天前日志。避免单日志无限膨胀。

简单示例配置 /etc/logrotate.d/bizlog    

1

2

3

4

5

6

7

/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 这类轮转后的历史归档文件。

三、对比两种根治方案

方案 logrotate crontab+find
作用 日志切割、压缩、保留份数、截断原文件 只删除已经切割完成的旧归档文件
处理活跃日志 ?支持,copytruncate 模式不用重启服务 ?不能处理活跃日志
能力 完整日志治理 仅做旧文件删除
生产建议 首选必备 辅助,搭配 logrotate 使用

版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计