Linux ext4 文件删除后空间没有释放是什么原因
在 ext4 上执行 rm 删除大文件后,df -h 仍显示磁盘接近满,最常见的原因不是 ext4 “删除失败”,而是某个进程还持有这个文件的打开描述符。目录里的文件名已经消失,但 inode 和数据块要等最后一个打开引用释放后才真正回收。
先用df确认哪个挂载点紧张,再用lsof +L1找出已删除但仍打开的文件;确认服务可以安全重载或重启后,空间通常会立即回收。
du只统计目录树中还能访问到的文件,不能代表所有仍占用块的对象。lsof +L1重点查看链接数为 0 的打开文件,输出中的(deleted)是关键线索。- 生产环境优先平滑重载或重启对应服务,不要直接对陌生 PID 执行 kill -9。
一、为什么 rm 后 df 仍然不变
Linux 文件名只是目录项对 inode 的一个引用。执行 rm 后,目录项被移除,新的进程不能再通过原路径打开它;但已经打开文件的进程仍然拥有文件描述符,内核仍需保持对应的文件对象和数据块。
因此会出现一个很容易误判的差额:du -sh /var/log 看不到刚删除的日志,而 df -h /var 仍然显示大量空间被占用。真正的回收点不是删除命令返回的时刻,而是最后一个引用关闭的时刻。进程退出、主动关闭描述符或服务重启,都可能触发回收。

二、用 lsof 定位哪个进程还持有文件
排查时不要一上来扫描整个根目录。先找出紧张的文件系统,再限定挂载点,结果更容易解释,也不容易给线上机器增加无谓开销。
# 先确认哪个挂载点的可用空间异常 df -hT /var # 对照目录树中仍可见的文件总量 du -xsh /var/log # 只列出链接数小于 1、但仍被进程打开的文件 lsof -nP +L1 /var
重点看 COMMAND、PID、FD、SIZE/OFF 和 NAME。如果名称末尾出现 (deleted),说明路径引用已断开;若文件很大,且所在设备与 df 检查的是同一个挂载点,就基本能解释“du 很小、df 仍满”的现象。
| 命令或字段 | 观察对象 | 排障用途 |
|---|---|---|
df -hT | 文件系统容量 | 确认设备、类型和挂载点 |
du -xsh | 目录树可见文件 | 排除普通大文件和跨挂载误算 |
lsof +L1 | 进程持有的已删除文件 | 定位 PID、FD 和占用大小 |

三、生产环境怎样释放空间又不误杀服务
确认 PID 后,先查它属于哪个服务、是否正在写入以及是否有主备或滚动发布能力。正在写日志的进程不能只看“文件已删除”就强制结束,否则可能丢失请求、连接或未刷新的缓冲数据。
# 查看 PID 的命令行,避免只凭 COMMAND 列猜服务 ps -fp 2486 # 查看该服务当前的 systemd 状态和最近日志 systemctl status example-worker.service --no-pager journalctl -u example-worker.service -n 30 --no-pager # 确认变更窗口后,优先让服务按自己的关闭流程释放描述符 sudo systemctl restart example-worker.service # 回到同一挂载点确认空间是否已经回收 df -hT /var
如果服务支持重新打开日志,可以先使用它的官方 reload 方式;只有在确认无平滑方案、且已完成流量切换或故障处置时,才考虑停止进程。直接操作 /proc/PID/fd/FD 属于高风险手段,除非你清楚应用的写入语义和恢复方式,否则不应作为通用教程步骤。
- 服务仍在写入:先保存 PID、FD、文件大小和服务状态,安排重载或重启。
- 多个进程持有同一类 deleted 文件:逐个确认归属,不要批量杀进程。
- 重启后空间仍不变:重新执行
lsof +L1,确认是否还有其他 PID 或其他挂载点。
四、常见问题
为什么 lsof 没有输出,但 df 还是很满?
可能是查询路径与挂载点不一致、权限不足、文件已经真正关闭,或者空间问题并非 deleted 文件。分别去掉路径限制检查目标挂载点,并核对 inode、容器挂载和其他大文件。
删除后 du 和 df 的差额一定是打开文件吗?
不一定。还要考虑多个挂载点、预留空间、稀疏文件、容器 overlay 文件系统等情况。只有 lsof +L1 找到同一设备上的大文件,才能把它作为本次差额的直接证据。
可以直接 kill -9 解决吗?
不建议。SIGKILL 会跳过应用自己的清理逻辑,可能造成请求中断或数据损失。先确认服务身份和业务影响,再用平滑重载、正常重启或经过审批的停止操作释放文件句柄。
Go 怎么用 httptest.NewServer 测试重定向链
- 上一篇
- Go 怎么用 httptest.NewServer 测试重定向链
- 下一篇
- Go reflect.ValueOf(nil).IsValid 为什么是 false
-
- 文章 · linux | 2小时前 |
- Linux nftables 规则顺序导致流量不通时怎么定位
- 184浏览 收藏
-
- 文章 · linux | 5小时前 |
- Linux vmstat 和 iostat 怎么区分 CPU 等待还是磁盘等待
- 299浏览 收藏
-
- 文章 · linux | 6小时前 | Linux · cgroups v2 · memory.max · memory.current ·
- Linux cgroups v2 怎么判断容器内存限制是否生效
- 101浏览 收藏
-
- 文章 · linux | 11小时前 | Linux · systemd · 日志诊断 · systemd journalctl 日志导出
- Linux journalctl 怎么按服务和时间范围导出诊断日志
- 280浏览 收藏
-
- 文章 · linux | 12小时前 | systemd · Linux教程 · 服务资源 · Linux systemd LimitNOFILE TasksMax LimitNPROC
- Linux systemd 服务怎么限制打开文件数和进程数
- 383浏览 收藏
-
- 文章 · linux | 1天前 | 权限 · Linux · 运维排障 · Linux文件权限 umask default acl
- Linux 新建文件权限为什么不是设置的 777
- 237浏览 收藏
-
- 文章 · linux | 1天前 |
- Linux 怎么查某个文件正被哪些进程使用
- 289浏览 收藏
-
- 文章 · linux | 1天前 |
- Linux 怎么查询指定端口由哪个进程监听
- 111浏览 收藏
-
- 文章 · linux | 1天前 |
- Shell 怎么逐行读取包含空格和反斜杠的文件
- 358浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- SuperCLUE
- SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
- 172次使用
-
- C-Eval
- 深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
- 102次使用
-
- AI Prompt Library
- 探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
- 24次使用
-
- LangGPT
- LangGPT是一种受编程语言启发的结构化提示词设计工具,提供双层框架、模块化模板及变量功能,帮助用户高效编写高质量Prompt。该项目已在GitHub免费开源,适用于内容创作、编程辅助等多场景。
- 35次使用
-
- ClickPrompt
- ClickPrompt是一款专为AI提示词编写者设计的开源在线工具,支持Stable Diffusion绘图、ChatGPT对话及GitHub Copilot代码辅助。提供Prompt自动生成、一键运行、社区分享及可视化优化功能,帮助用户高效获取精准AI输出。
- 74次使用
-
- 详解golang执行Linuxshell命令完整场景下的使用方法
- 2023-01-07 426浏览
-
- go程序部署到linux上运行的实现方法
- 2023-01-02 387浏览
-
- Linux系统下Go语言开发环境搭建
- 2023-01-07 242浏览
-
- 使用golang获取linux上文件的访问/创建/修改时间
- 2022-12-31 238浏览
-
- 在Linux系统中安装Go语言的详细教程
- 2022-12-29 402浏览

