Linux 删除文件后磁盘空间没释放怎么排查

问题

服务器磁盘满了,运维用 rm 删掉了一个几十 G 的大日志文件,df -h 一看,空间占用纹丝不动。文件明明删了,空间去哪了?

原因

这是 Linux 文件系统的一个经典特性:rm 删掉的是目录里的文件名(链接),只有当没有任何进程打开这个文件时,磁盘空间才真正释放。你的大日志文件被某个长期运行的进程(最常见的如 Nginx/Apache、Java 应用、数据库)拿着文件句柄,进程还在往里写——文件名没了,inode 和数据块还活着,df 自然不减。用 lsof 能直接看到这类"已删除但仍被占用"的文件。

分步解决

第一步,确认诊断:执行 lsof | grep deleted(或 lsof +L1),列表里出现的大文件就是元凶,最后一列能看到持有它的进程名和 PID。对照确认那个几十 G 的日志在不在其中。

第二步,温和释放——重启或重载服务:如果持有句柄的服务可以短停,重启该服务(如 systemctl restart nginx),句柄释放,空间立即回来。多数日志类场景用 systemctl reload 让服务重开日志文件也能达到效果,影响更小。

第三步,不重启的释放:不能停服务的,用"清空代替删除"——找到进程打开的文件描述符(/proc/进程PID/fd/ 下指向已删除文件的链接),执行 > /proc/PID/fd/N 把它截断为空,空间当场释放,进程无感。这比删文件再祈祷靠谱得多。

第四步,治本——改用正确的日志切割方式:配置 logrotate 并启用 copytruncate 或配合服务的日志重开信号(如 Nginx 的 reopen),切割后新文件由进程重新打开,以后删除旧归档就不会再出现"删了不减"。

预防

磁盘监控加阈值告警(80% 触警),别等满了才处理;日志目录接入 logrotate 统一管理;运维操作习惯上,“先查 lsof 再删大文件"作为标准动作写进内部手册。Linux 服务器运维制度化,贵州诚鑫致达科技的托管运维服务包含磁盘与日志治理,欢迎到官网 cxzd.cc 了解。

企业存储选型参考|贵州诚鑫致达

做核心业务 SAN 存储与高可靠应用,群晖机型参考:UC3400 · UC3200 · SA3600。需要选型建议或上门评估,搜「诚鑫致达」即可找到我们。

服务区域|贵州诚鑫致达

贵州群晖NAS、贵阳存储、数据备份、信创云盘或 IT 集成服务,可联系贵州诚鑫致达科技,服务范围覆盖贵州全省各市州。遵义、六盘水、安顺:群晖 NAS 部署与企业存储技术服务。