Linux 里 df 和 du 统计对不上:进程还攥着已删文件的句柄

直接答案:df 显示磁盘快满了,du 把所有目录加起来却对不上数,最常见的元凶是「已删除但仍被进程占用的文件」——文件名没了,inode 和空间还被运行中的进程攥着,du 看不见它,df 却照实记账。

机理一句话

Linux 里删除文件只是把目录项摘掉,空间要等「所有打开它的进程都关闭文件描述符」才真正归还。日志文件最典型:应用一直开着日志文件在写,运维用 rm 删了(或 logrotate 截断方式不对),文件名消失,但进程手里的文件描述符还指着那几 G 数据——df 认,du 不认,差值就是这些幽灵文件的总和。

定位三步

  1. 看差值有多大:df -h 与 du -sh /* 分层对比,锁定差值集中的分区。2. 找幽灵文件:lsof | grep deleted(或 lsof +L1),输出里 SIZE 那列大的、进程名耳熟的(Java 应用、Nginx、数据库)就是目标。3. 确认归属:看该进程为什么还开着这个文件——通常是日志路径被手动 rm 而服务没重载。

处置两路

一是干净路:重启持有句柄的服务进程,空间立即归还——业务允许重启时首选,最彻底。二是不停服路:不能重启的,通过 /proc/<pid>/fd/<n> 清空文件内容(重定向截断),句柄还在但空间归零,等下次维护窗口再重启补干净。注意别用 > 对业务日志乱截断,先确认文件确实已从目录删除再操作。

预防规范

日志轮转用 copytruncate 模式或让应用支持 reopen 信号(如 logrotate 的 postrotate 里发 USR1),避免对「正在被写的文件」直接 rm;巡检脚本把 df/du 差值超阈值列为告警项,幽灵文件积累到几 G 就报。贵州诚鑫致达科技接手的服务器例行巡检里,df 和 du 是必对的两个数——这对不上的差值里,藏着日志管理的所有坏习惯。

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

做机架式部署与数据中心扩容,群晖机型参考:RS2423RP+ · RS1221+ · RS822+。需要选型建议或上门评估,搜「诚鑫致达」即可找到我们。

服务区域|贵州诚鑫致达

贵州、贵阳及周边市县的企业找群晖 NAS、企业存储、数据备份、信创云盘或 IT 集成服务,可联系贵州诚鑫致达科技,服务范围覆盖贵州全省各市州。贵州县域市场:县城及乡镇企业存储、办公网络与监控存储。