日常运维中,你是否遇到过这样的情况:明明已经删除了大文件,但磁盘空间却迟迟未释放?du 显示没问题,df 却提示磁盘快满?这背后可能隐藏着一种“幽灵文件”现象。本文将带你深入了解问题根源,并借助 lsof
工具快速定位并解决这类疑难问题。
什么是“幽灵文件”?
“幽灵文件”(又叫 deleted but open files
)是指已经被从文件系统中删除,但依然被某些进程打开着的文件。它们不再出现在目录结构中,但因为被进程持有,它们的空间不会被释放。
? 举个例子:
你运行了一个程序,它在写一个日志文件 audit.log
。某天你为了节省空间直接删除了 audit.log
,但这个程序并没有关闭文件句柄,导致这部分空间仍然被占用。
[root@s-zb-dba02 mnt]# lsof +L1 | grep deleted
auditd 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% /dev
tmpfs 252G 771M 252G 1% /dev/shm
tmpfs 252G 14G 239G 6% /run
tmpfs 252G 0 252G 0% /sys/fs/cgroup
/dev/mapper/rhel-root 42G 41G 1.2G 98% /
....
而 du -sh /*
却发现加起来没这么多空间:
du-sh /*
8G /var
1G /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 NAME
auditd 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
,不仅能迅速定位问题,更能为你节省大量排查时间。
记住:删除不等于释放,进程还在引用,就还占空间!
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://www.hqyman.cn/post/11840.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~