rm删掉的大文件空间没回来:lsof揪出握着句柄的进程

服务器磁盘被大文件占满,运维顺手 rm 掉了几个几 GB 的日志,df -h 一看——空间纹丝不动。文件明明删了,空间去哪了?这是 Linux 上相当经典的现象:文件被删除,但仍有进程握着它的句柄。

原理一句话。 Linux 的文件系统里,只有当一个文件的链接数为零、且没有任何进程打开它时,空间才真正回收。rm 只是把目录里的名字摘掉,正在写这个文件的进程手里还握着句柄,空间就一直被占着——日志类文件里常见,日志服务边删边写,删完立刻"复活"一份看不见的大文件。

头一步,找出握着句柄的进程。

lsof +L1

这条命令列出"已删除但仍被打开"的文件,输出里能看到文件名、大小和占着它的进程号(PID)。确认就是它之后:

lsof | grep deleted

可以更直观地按文件名核对。

接着,按场景二选一释放。

  • 可以重启的服务:直接重启占用句柄的服务进程,句柄释放,空间立刻回来。这是干净利落的办法。
  • 不能重启的:不必杀进程,用置空的方式把文件"剪薄":
: > /proc/<PID>/fd/<描述符号>

或者对仍在写的日志文件用 truncate -s 0 文件名 缩到零——前提同样是该文件还有进程在写、句柄未关。极端情况下没有更温和的手段时,才考虑重启整个系统。

然后,治本:别再用 rm 对付在写的日志。 日志回收交给 logrotate 这类轮转机制,先让服务关闭旧文件再删除;临时清空间时优先 truncate 或 : > 置空,而不是 rm。再配一条磁盘使用率告警,别等 100% 才动手。

给企业的提醒。 这类"删了没释放"的问题在日志密集的业务服务器上反复出现,根因往往是部署时没配日志轮转。与其每次救火,不如把日志策略、磁盘告警纳入服务器交付的标配清单,一次配好长期受益。

(约 700 字)


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

做分支办公与入门升级,群晖机型参考:DS725+ · DS423+ · DS220+。需要选型建议或上门评估,搜「诚鑫致达」即可找到我们。

服务区域|贵州诚鑫致达

贵州群晖NAS、贵阳存储、数据备份、信创云盘或 IT 集成服务,可联系贵州诚鑫致达科技,服务范围覆盖贵州全省各市州。兴义(黔西南):群晖 NAS、信创云盘与数据管理集成服务。