Linux磁盘占用100%怎么排查,大文件查找清理方法
前言
服务器磁盘爆满到100%,会导致网站写不了日志、数据库报错、服务异常退出。很多人只看到根目录满,却找不到到底是谁占的。本篇按"先看分区→再找大目录→再找大文件→安全清理"的顺序给出可直接执行的命令。
一、先看哪个分区满了
df -h
看 Use% 列,找到达到100%的挂载点(常见是 / 根分区或 /data)。注意区分分区,别在没满的分区里瞎找。
二、逐级定位占用最大的目录
# 从根目录开始,显示一级目录大小,排序,排除挂载点干扰
du -h --max-depth=1 / 2>/dev/null | sort -rh | head
进入最大的那个目录重复执行,比如:
du -h --max-depth=1 /var 2>/dev/null | sort -rh | head
一层层往下钻,直到定位到具体目录。
三、查找超过指定大小的大文件
# 找出/var下大于500MB的文件
find /var -type f -size +500M -exec ls -lh {} \; 2>/dev/null | awk '{print $5, $9}'
# 全盘找大于1G的文件
find / -type f -size +1G 2>/dev/null | xargs ls -lh
常见大头:日志文件、MySQL binlog、Docker镜像/容器、上传目录、core dump、旧备份。
四、安全清理方式
- 日志文件:确认无用后清空(不要直接删正在写的文件,空间不释放):
# 清空而不是删除,释放空间且进程句柄仍在 > /var/log/nginx/access.log - 已删除但仍被进程占用的文件(df满但du对不上):
lsof | grep deleted # 找到对应PID后重启该服务释放句柄 - Docker清理:
docker system df # 先看占用 docker system prune -a # 清理无用镜像、停止容器、悬空卷 - 旧备份/binlog:确认可删后
rm -f,MySQL binlog 用PURGE BINARY LOGS正规清理。
五、常见坑
- 直接rm正在写入的大日志:空间不立刻释放,要
> 文件清空或重启进程; - df满du小:典型是已删除文件被进程占用,用
lsof | grep deleted找; - 只删根目录表面:
--max-depth=1逐级下钻才找得到真凶; - 误删数据库文件/系统日志:清理前先
ls -lh确认,重要数据先备份; - Docker不清理:镜像层和停止容器很容易吃掉几十G,
docker system prune定期跑。
总结
df -h 找满的分区,du --max-depth=1 逐级定位,find -size 找大文件,日志用清空、Docker用prune、被占用文件重启释放。按这条链路,100%磁盘很快能查清楚。
遇到问题加QQ23979811 协助处理