删除文件后磁盘空间未释放是因为文件被进程占用,可通过 df 和 du 对比确认差异,用 lsof +L1 查找已删但仍在使用的文件,再通过 kill 或清空 /proc/PID/fd/N 释放空间。

删除文件后磁盘空间没释放,不是文件没删掉,而是文件还在被某个进程“握着”——进程仍通过文件描述符读写它,内核就继续保留数据块,不回收空间。
确认是不是这个问题
先看磁盘真实使用情况:
- 运行 df -h 查整体空间占用(比如 / 分区已满)
- 再运行 du -sh /* 2>/dev/null | sort -hr | head -5 看各目录实际大小
- 如果 df 显示已用 98%,但 du 加起来才 80%,差值部分大概率就是被删未释放的文件占的
找出哪些进程在占用已删文件
执行命令定位具体进程和文件:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- lsof +L1 —— 列出所有标记为 (deleted) 的打开文件(最常用)
- 或者按路径缩小范围:lsof /var/log | grep deleted(适合怀疑日志类)
- 输出示例:
nginx 1234 root 7w REG 8,1 2.1G 123456 /var/log/access.log (deleted),其中 1234 是 PID,7w 是文件描述符号
安全释放空间的两种方式
选哪种取决于业务能否中断:
-
终止进程(推荐,见效快):
kill -9 1234(替换为实际 PID)。适用于测试环境或可中断服务;生产环境建议先kill -15 1234尝试优雅退出 -
不清退进程,只清空内容(需 root):
echo > /proc/1234/fd/7(FD 号来自 lsof 输出的数字列)。这会让文件变为空,释放磁盘块,进程还能继续写新日志,适合 nginx、java 等长期运行服务
预防以后再发生
日常运维中注意三点:
- 别直接
rm正在写的日志文件,改用truncate -s 0 filename或> filename - 配置 logrotate 自动轮转,避免单个日志无限增长
- 加个简单监控:每天跑一次
df -h && du -sh / | sort -hr对比,差值超 1G 就告警

















