Linux删除文件后空间未释放是因进程仍持有文件句柄;需用df与du比对确认,再通过sudo lsof +L1精准定位已删未释文件,结合/proc/PID/fd/查看大小并重启对应服务释放空间。

Linux 中删除文件后空间没释放,不是删得不干净,而是进程还攥着文件句柄——文件从目录里消失了,但磁盘块仍被锁住。排查这类问题,核心是定位那些“已删但仍在用”的文件及其所属进程。
确认是否存在空间虚假占用
先看 df 和 du 是否明显不一致:
- 运行 df -h 查根分区使用率(比如显示 / 已用 95%)
- 再运行 du -sh /* 2>/dev/null | sort -h 统计各一级目录真实大小
- 若两者差值达几百 MB 或数 GB(例如 df 显示用了 18G,du 加起来才 14G),基本可判定存在已删未释的文件
精准找出被删但仍在用的文件
别用 lsof | grep deleted ——容易误匹配路径含 deleted 的正常文件(如 /tmp/deleted_cache)。正确方法是:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- sudo lsof +L1:只列出链接计数为 0 的打开文件,即真正被 unlink 但 fd 仍活跃的文件
- 加限定更高效:sudo lsof +L1 /var/log(查日志目录)、sudo lsof -u www-data +L1(查指定用户)
- 输出中重点关注:PID(进程号)、COMMAND(进程名)、FD(如
1w表示写入描述符)、SIZE/OFF(当前占用字节数)、最后一列带 (deleted)
判断实际空间影响和归属
光看到 (deleted) 不够,得确认它到底占多少、属于哪个服务:
- 用 ls -lh /proc/PID/fd/FD号(如
ls -lh /proc/1234/fd/1)查看是否指向具体大小(如3.2G) - 或直接统计:du -sh /proc/PID/fd/FD号
- 快速估算所有已删文件总大小:sudo lsof +L1 2>/dev/null | awk '{sum += $7} END {printf "MB: %.0f\n", sum/1024/1024}'
- 查进程归属:ps -p PID -o pid,ppid,comm,args 或 systemctl status PID
安全释放空间的操作方式
不建议一上来就 kill -9,优先考虑平滑释放:
- 日志类进程(如 rsyslog、nginx):尝试 sudo kill -HUP PID 或 sudo kill -USR1 PID,触发日志 reopen
- 确认所属服务后,用 systemctl restart servicename(如
systemctl restart rsyslog)最稳妥 - 仅在调试或无主进程场景下,才考虑 echo "" > /proc/PID/fd/FD号 清空内容(注意:部分应用可能因长度突变异常)

















