不求甚解

此博客为个人学习之用,如与其他作品雷同,纯属巧合。

导航

🧠 Linux 删除文件后空间未释放问题处理(知识库)

🔍 问题原因

在 Linux 中,删除文件只是减少链接数,如果该文件仍被某个进程占用(有打开的文件句柄),磁盘空间不会立即释放。


📌 常见现象

  • df 显示磁盘已满,但 du 查看目录空间较小。
  • 日志文件已被删除(如 logrotate 或手动 rm),但空间未释放。

🔎 定位方法

方法1:查找 deleted 文件

lsof | grep deleted

输出示例:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java     1234   root    4w   REG  253,0  ... /var/log/app.log (deleted)

方法2:查找链接数为0的文件

lsof +L1

🛠️ 解决方法

✅ 推荐方式:重启对应进程

获取进程信息:

ps -p PID
netstat -antp | grep PID

重启服务或终止进程:

systemctl restart <service-name>
kill -9 PID

⚠️ 注意:谨慎操作,避免影响业务。


⚠️ 应急方式:清空文件内容(慎用)

echo > /proc/PID/fd/FD_NUMBER

例如:

echo > /proc/1234/fd/4

✅ 仅适用于日志类文件,不能真正释放句柄,需配合进程重载使用。


🧠 文件删除机制简述

  • rm file → 减少链接数。
  • 若仍有进程持有 fd → 文件不真正删除。
  • 只有当链接数为 0 且无进程持有 fd → 空间才释放。

🧹 排查流程总结(快捷步骤)

df -h                     # 查看磁盘空间
lsof | grep deleted       # 查找 deleted 文件
ps -p PID                 # 查看进程信息
systemctl restart xxx     # 或 kill 进程
df -h                     # 再次确认空间是否释放