首页/系统/信创系统运维速查/删除文件后空间不释放
常见问题65 条

删除文件后空间不释放

文件删除但空间不降:说明仍有进程持有句柄,用 lsof +L1 找到持有者,滚动重启对应进程即可回收空间。

信创系统运维速查系统更新于 2026-10-13

删除文件后空间不释放是怎么回事

在 Linux 上删除文件实际是减少链接计数:如果仍有进程持有该文件的句柄,数据块不会真正释放,df 显示的可用空间就不会增加。典型场景是日志文件被手工删除而写日志的进程还在运行,文件在枚举中已经看不到,空间却一直占着。定位方式是查找处于已删除状态但仍被打开的句柄,稳妥的回收办法是让持有进程重新打开文件,通常是滚动重启该进程。

基本信息

定位命令lsof +L1 列出已删除但未关闭的句柄
统计视角按命令聚合统计占用规模
回收方式重启或重载持有句柄的进程
根因预防配置日志轮转,避免手工删除日志
判断依据df 与 du 数字差距明显

典型使用场景

  • 手工删除了大日志文件,df 仍显示空间紧张
  • 空间告警处置后发现释放量远小于预期,需要解释差异
  • 服务重启后空间自动恢复,确认是句柄未释放导致
  • 排查长期运行进程持有的历史文件,评估是否需要重载
  • 为日志型应用设计轮转与重载方案,从根本上避免问题
  • 容量统计中出现「消失的空间」,需要给出可核对的技术解释

定位与回收

定位与回收
df -h /var                             # 确认可用空间与预期是否相符
lsof +L1 | head -20                    # 列出已删除但未关闭的句柄
lsof +L1 | awk '{print $1}' | sort | uniq -c | sort -rn | head   # 按命令聚合
lsof +L1 | awk '{print $7, $1, $2}' | sort -rn | head   # 看占用大小排行
# 稳妥做法:滚动重启持有句柄的进程,回收空间
systemctl restart app-web
# 日志型应用重载后重新打开文件,效果类似且中断更小
# 不建议直接操作 /proc/<pid>/fd:可能破坏应用状态
lsof -p <PID> | head                   # 确认进程当前打开的文件

现象与原因对照

现象原因处理
删除后空间不降进程仍持有句柄重启或重载该进程
df 与 du 差距大存在已删除但打开的文件用 lsof +L1 定位
重启服务后空间恢复句柄被释放配置轮转避免再次发生
日志持续增长不轮转缺少轮转策略补齐 logrotate 或等价机制
空间被占但找不到文件文件已在枚举中消失从进程句柄角度排查
日志文件删除后空间不释放是最常见的形态;把日志轮转配好并让进程在轮转后重新打开文件,可以从机制上避免反复出现同类问题。
重启持有句柄的进程前评估业务可中断性:大内存服务重启窗口较长,应安排在维护窗口内进行,而不是在告警压力下临时执行。

易错点

  • df 与 du 对不上就怀疑文件系统损坏,跳过句柄排查直接做修复,方向完全错误
  • 用截断工具改写正在写入的日志文件,可能造成文件稀疏化与统计混乱
  • 直接操作 /proc 下的文件描述符试图释放空间,可能破坏应用状态
  • 不做轮转规划,靠定期人工删除日志,问题周期性重现

数据来源与参考

  • man 8 lsof
  • man 1 df
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌