Linux磁盘空间满但删除文件不释放,通常因文件被进程占用而未真正释放;需用lsof +L1或grep deleted查找已删仍打开的文件,再通过重启服务或清空/proc/PID/fd/FD_NUMBER释放空间。

当Linux系统提示磁盘空间满(如df -h显示/或/var使用率100%),但删除文件后df仍不释放空间,通常是因为被删除的文件仍被进程占用——即“已删未释放”。df统计的是文件系统实际占用块,而非文件列表,所以关键要找出这些“幽灵文件”。
确认是否为已删除但被进程占用的文件
df显示满,但du -sh /* 2>/dev/null | sort -hr | head -5总和明显偏小,就高度可疑。这类文件在ls中不可见,但在/proc/*/fd/里有符号链接指向它们(路径含deleted字样)。
用lsof定位被占用的已删文件
运行以下命令查找所有状态为deleted且被打开的文件:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
lsof +L1—— 直接列出所有链接数为0(即已被删)但仍被打开的文件 -
lsof | grep deleted | grep -v "unavailable"—— 补充筛选,关注实际路径含(deleted)的行 - 重点关注
SIZE/OFF列值大的项,通常是日志或临时大文件
安全释放空间的两种方式
找到对应进程(看PID列)后,按场景选择处理方式:
-
重启服务:若进程是
nginx、java、rsyslog等可重启服务,执行systemctl restart xxx或kill -HUP PID(对支持重载的服务更稳妥) -
清空文件描述符而不重启:对不能停机的关键进程(如数据库),可用
echo > /proc/PID/fd/FD_NUMBER截断该fd指向的已删文件(需root权限,且仅当fd以写方式打开时有效) - ⚠️ 注意:
kill -9强制终止可能引发数据不一致,不推荐作为首选
预防与日常监控建议
避免反复踩坑,可做这几件事:
- 配置
logrotate并启用copytruncate(适用于无法重开日志句柄的服务) - 定期检查大文件:
find /var/log -type f -size +100M -ls 2>/dev/null - 设置
df告警阈值(如85%),早于100%介入 - 注意容器环境:宿主机
df满可能源于某个容器内未清理的日志(docker logs --tail 100 container查,docker system prune -a慎用)
不复杂但容易忽略:df和du差异本身就是一个诊断信号,抓住它就能快速锁定问题本质。

















