运行 sudo lsof +l1 可精准定位被删除但仍被进程占用的文件,其原理是内核因文件句柄未关闭而无法回收数据块;结合 df 与 du 差值可确认问题存在,再通过 /proc/pid/fd/ 查看大小、ps 或 systemctl 确认归属,最后用 sighup、清空 fd 或服务重启安全释放空间。

直接用 sudo lsof +L1 就能找出真正被删除但仍在占用磁盘空间的文件及其所属进程。这不是误删没清干净,而是进程还握着文件句柄,内核不敢回收数据块。
确认问题确实存在
先看磁盘使用是否“对不上”:
- 运行 df -h / 查根分区实际使用率(比如显示已用 92%)
- 再运行 du -sh /* 2>/dev/null | sort -h 统计各一级目录真实大小
- 如果两者差值明显(例如 df 显示用了 16G,du 加起来才 11G),差的那部分基本就是被删未释文件占的
精准定位占用进程和文件
别用 lsof | grep deleted —— 容易匹配到路径含 deleted 的正常目录(比如 /tmp/deleted_cache):
- 执行 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就是实打实占的空间 - 快速估算总量: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,优先选低风险操作:
-
发重载信号(推荐):多数日志服务支持
SIGHUP,执行 kill -HUP PID,进程会关闭旧 fd、新建日志文件,原空间自动回收 - 清空 fd 内容(应急):执行 echo > /proc/PID/fd/FD号(需 root),立即释放空间且进程不中断;注意这会丢掉当前缓冲中的内容
- 确认无业务影响后,也可用 systemctl restart servicename 替代直接 kill











