深入解析:用 lsof 揪出“幽靈文件”釋放磁盤(pán)空間
日常運(yùn)維中,你是否遇到過(guò)這樣的情況:明明已經(jīng)刪除了大文件,但磁盤(pán)空間卻遲遲未釋放?du 顯示沒(méi)問(wèn)題,df 卻提示磁盤(pán)快滿?這背后可能隱藏著一種“幽靈文件”現(xiàn)象。本文將帶你深入了解問(wèn)題根源,并借助 lsof 工具快速定位并解決這類疑難問(wèn)題。
什么是“幽靈文件”?
“幽靈文件”(又叫 deleted but open files)是指已經(jīng)被從文件系統(tǒng)中刪除,但依然被某些進(jìn)程打開(kāi)著的文件。它們不再出現(xiàn)在目錄結(jié)構(gòu)中,但因?yàn)楸贿M(jìn)程持有,它們的空間不會(huì)被釋放。
?? 舉個(gè)例子:你運(yùn)行了一個(gè)程序,它在寫(xiě)一個(gè)日志文件 audit.log。某天你為了節(jié)省空間直接刪除了 audit.log,但這個(gè)程序并沒(méi)有關(guān)閉文件句柄,導(dǎo)致這部分空間仍然被占用。
[root@s-zb-dba02 mnt]# lsof +L1 | grep deleted
auditd 6134 root 4w REG 253,0155446270995536 /var/log/audit/audit.log (deleted)
.....
問(wèn)題表現(xiàn)
使用 df -h 看到根目錄快滿:
[root@s-zb-dba02 mnt]# df -h
文件系統(tǒng) 容量 已用 可用 已用% 掛載點(diǎn)
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 /* 卻發(fā)現(xiàn)加起來(lái)沒(méi)這么多空間:
du-sh /*
8G /var
1G /home
...
總計(jì)加起來(lái)遠(yuǎn)遠(yuǎn)小于 42G
這就說(shuō)明:有空間被“非文件系統(tǒng)中的文件”占用了,也就是“幽靈文件”!
lsof 是什么?
lsof(List Open Files)是 Linux 系統(tǒng)的核心診斷工具,它能列出所有進(jìn)程打開(kāi)的文件資源。在 Linux哲學(xué)中"一切皆文件"的背景下,lsof 可查看的不僅是常規(guī)文件,還包括:
- 網(wǎng)絡(luò)套接字(TCP/UDP)
- 管道(PIPE)和 FIFO
- 共享內(nèi)存
- 設(shè)備文件
- 被刪除但仍被進(jìn)程占用的文件
基礎(chǔ)用法速查:
# 查看指定進(jìn)程打開(kāi)的文件
$ lsof-p<PID>
# 查看指定用戶打開(kāi)的文件
$ lsof-u<username>
# 查看指定目錄下被打開(kāi)的文件
$ lsof +D /path/to/dir
# 查看指定文件系統(tǒng)的打開(kāi)文件(推薦排查磁盤(pán)空間問(wèn)題)
$ lsof +aL1 <mount-point>
關(guān)鍵參數(shù)解析:
- +a:AND條件組合
- +L1:僅顯示鏈接數(shù)小于1的文件(即被刪除的文件)
- +aL1:組合條件查找已刪除但被占用的文件
如何用 lsof 揪出“幽靈文件”?
你只需要一條命令,就能找到這些占用磁盤(pán)空間的“幽靈文件”:
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:哪個(gè)進(jìn)程
- PID:進(jìn)程 ID
- FILE:文件類型(txt、mem、del等)
- SIZE:文件大小
- NAME:文件路徑(顯示 deleted)
如何解決?
(1) 方法一:重啟進(jìn)程(推薦)
找到對(duì)應(yīng)的 PID,使用如下命令結(jié)束它:
kill-91234
或者優(yōu)雅重啟進(jìn)程(推薦):
systemctl restart auditd
注意:重啟服務(wù)前請(qǐng)確保不影響業(yè)務(wù)運(yùn)行!
(2) 方法二:使用 truncate 清空文件
若不能重啟,可以通過(guò) proc 文件系統(tǒng),清空該文件句柄:
truncate -s0 /proc/6134/fd/4
其中 6134 是 PID,4 是對(duì)應(yīng)的文件描述符,可在 lsof 結(jié)果中找到。
預(yù)防措施
- 程序中使用日志輪轉(zhuǎn)(logrotate)+ 信號(hào)通知關(guān)閉舊句柄。
- 日志定期清理時(shí),建議使用 truncate 而不是 rm。
- 定期巡檢系統(tǒng)中被刪除但仍然打開(kāi)的文件:
lsof|grep deleted
小結(jié)
“幽靈文件”雖不常見(jiàn),但一旦出現(xiàn)就很容易造成磁盤(pán)空間莫名減少。掌握 lsof,不僅能迅速定位問(wèn)題,更能為你節(jié)省大量排查時(shí)間。
記?。簞h除不等于釋放,進(jìn)程還在引用,就還占空間!