深入解析:用lsof揪出幽灵文件释放磁盘空间

admin 2025年6月24日20:43:38评论2 views字数 2617阅读8分43秒阅读模式

日常运维中,你是否遇到过这样的情况:明明已经删除了大文件,但磁盘空间却迟迟未释放?du 显示没问题,df 却提示磁盘快满?这背后可能隐藏着一种“幽灵文件”现象。本文将带你深入了解问题根源,并借助 lsof 工具快速定位并解决这类疑难问题。

深入解析:用lsof揪出幽灵文件释放磁盘空间

什么是“幽灵文件”?

“幽灵文件”(又叫 deleted but open files)是指已经被从文件系统中删除,但依然被某些进程打开着的文件。它们不再出现在目录结构中,但因为被进程持有,它们的空间不会被释放。

📌 举个例子:你运行了一个程序,它在写一个日志文件 audit.log。某天你为了节省空间直接删除了 audit.log,但这个程序并没有关闭文件句柄,导致这部分空间仍然被占用。

[root@s-zb-dba02 mnt]# lsof +L1 | grep deletedauditd    6134   root    4w   REG  253,0155446270995536 /var/log/audit/audit.log (deleted).....

问题表现

使用 df -h 看到根目录快满:

[root@s-zb-dba02 mnt]# df -h文件系统                 容量  已用  可用 已用% 挂载点devtmpfs                 252G     0  252G    0% /devtmpfs                    252G  771M  252G    1% /dev/shmtmpfs                    252G   14G  239G    6% /runtmpfs                    252G     0  252G    0% /sys/fs/cgroup/dev/mapper/rhel-root     42G   41G  1.2G   98% /....

而 du -sh /* 却发现加起来没这么多空间:

du-sh /*8G /var1G /home...总计加起来远远小于 42G

🧩 这就说明:有空间被“非文件系统中的文件”占用了,也就是“幽灵文件”!

lsof 是什么?

lsof(List Open Files)是 Linux 系统的核心诊断工具,它能列出所有进程打开的文件资源。在 Linux哲学中"一切皆文件"的背景下,lsof 可查看的不仅是常规文件,还包括:

  • 网络套接字(TCP/UDP)
  • 管道(PIPE)和 FIFO
  • 共享内存
  • 设备文件
  • 被删除但仍被进程占用的文件

基础用法速查:

# 查看指定进程打开的文件lsof-p<PID># 查看指定用户打开的文件lsof-u<username># 查看指定目录下被打开的文件lsof +D /path/to/dir# 查看指定文件系统的打开文件(推荐排查磁盘空间问题)lsof +aL1 <mount-point>

关键参数解析:

  • +a:AND条件组合
  • +L1:仅显示链接数小于1的文件(即被删除的文件)
  • +aL1:组合条件查找已删除但被占用的文件

如何用 lsof 揪出“幽灵文件”?

你只需要一条命令,就能找到这些占用磁盘空间的“幽灵文件”:

lsof +L1 |grep deleted

示例输出:

COMMAND   PID    USER    FD   TYPE DEVICE     SIZE/OFF NLINK     NODE NAMEauditd    6134   root    4w   REG  253,0155446270995536 /var/log/audit/audit.log (deleted)tuned     7696   root    3w   REG  253,054912034451806 /var/log/tuned/tuned.log (deleted)rsyslogd  7700   root    5w   REG  253,0391297111920101454061 /var/log/messages-20250310 (deleted)rsyslogd  7700   root    6w   REG  253,0391297111920101454061 /var/log/messages-20250310 (deleted)rsyslogd  7700   root    7w   REG  253,0391297111920101454061 /var/log/messages-20250310 (deleted)rsyslogd  7700   root    8w   REG  253,0391297111920101454061 /var/log/messages-20250310 (deleted)

字段解释:

  • COMMAND:哪个进程
  • PID:进程 ID
  • FILE:文件类型(txt、mem、del等)
  • SIZE:文件大小
  • NAME:文件路径(显示 deleted)

如何解决?

方法一:重启进程(推荐)

找到对应的 PID,使用如下命令结束它:

kill-91234

或者优雅重启进程(推荐):

systemctl restart auditd

⚠️ 注意:重启服务前请确保不影响业务运行!

方法二:使用 truncate 清空文件

若不能重启,可以通过 proc 文件系统,清空该文件句柄:

 truncate -s0 /proc/6134/fd/4

其中 6134 是 PID,4 是对应的文件描述符,可在 lsof 结果中找到。

预防措施

  • 🛡️ 程序中使用日志轮转(logrotate)+ 信号通知关闭旧句柄。
  • 🛠️ 日志定期清理时,建议使用 truncate 而不是 rm
  • 🔍 定期巡检系统中被删除但仍然打开的文件:
lsof|grep deleted

小结

“幽灵文件”虽不常见,但一旦出现就很容易造成磁盘空间莫名减少。掌握 lsof,不仅能迅速定位问题,更能为你节省大量排查时间。

记住:删除不等于释放,进程还在引用,就还占空间!

推荐文章
深入解析:用lsof揪出幽灵文件释放磁盘空间

扫码关注公众号

关注我的博客
didiplus.kwpmp.cn

原文始发于微信公众号(攻城狮成长日记):深入解析:用lsof揪出“幽灵文件”释放磁盘空间

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月24日20:43:38
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   深入解析:用lsof揪出幽灵文件释放磁盘空间https://cn-sec.com/archives/4197979.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息