Lsof
lsof
的 FD 列在某些情況下顯示 DEL,而不是 FD 編號
- 這是什麼意思?
- 如何
lsof
找到這樣的FD?即與普通 FD 相比,可以很容易地找到ls -l /proc/$PID/fd/$FD
.$ lsof -p $(pgrep pulseaudio) | head -n1 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME $ lsof -p $(pgrep pulseaudio) | grep DEL pulseaudi 25911 alan-sysop DEL REG 0,5 2334404 /memfd:pulseaudio pulseaudi 25911 alan-sysop DEL REG 0,5 2340448 /memfd:pulseaudio pulseaudi 25911 alan-sysop DEL REG 0,5 2335426 /memfd:pulseaudio pulseaudi 25911 alan-sysop DEL REG 0,5 2340018 /memfd:pulseaudio pulseaudi 25911 alan-sysop DEL REG 0,5 2340021 /memfd:pulseaudio pulseaudi 25911 alan-sysop DEL REG 0,5 2334322 /memfd:pulseaudio pulseaudi 25911 alan-sysop DEL REG 0,5 2336421 /memfd:pulseaudio
man lsof
僅記錄列的DEL
值TYPE
,而不是FD
列。
lsof
通常報告來自 Linux/proc/<PID>/maps
文件的mem
條目類型FD 列。但是,當程序文件lsof
中找不到路徑並且文件條目包含時,表明文件在打開後被刪除,報告文件為。stat(2)``maps``maps``(deleted)``lsof``DEL
https://stackoverflow.com/a/37160579/1601027,正如@don_crissti 指出的那樣。
lsof
即使以 root 身份執行,也無法顯示這些文件的大小。(我lsof
的是 4.89 版)。但是,如果您同時擁有足夠新的核心和
root
訪問權限,那麼您既可以在 中查看映射ls -l /proc/$PID/map_files/
,也可以stat --dereference
在單個文件上執行以顯示它們的大小。這可用於檢查“已刪除”映射文件使用的資源。特別是memfd
s,它永遠不會出現在文件系統中,並且始終被視為(deleted)
文件。$ ls -l /proc/$(pgrep pulseaudio)/map_files | head total 0 lr--------. 1 alan-sysop alan-sysop 64 Mar 18 23:50 562004ac5000-562004ada000 -> /usr/bin/pulseaudio lr--------. 1 alan-sysop alan-sysop 64 Mar 18 23:50 562004cda000-562004cdb000 -> /usr/bin/pulseaudio lr--------. 1 alan-sysop alan-sysop 64 Mar 18 23:50 562004cdb000-562004cdc000 -> /usr/bin/pulseaudio lrw-------. 1 alan-sysop alan-sysop 64 Mar 18 23:50 7fab98000000-7fab9c000000 -> /memfd:pulseaudio (deleted) lrw-------. 1 alan-sysop alan-sysop 64 Mar 18 23:50 7fab9c000000-7faba0000000 -> /memfd:pulseaudio (deleted) lrw-------. 1 alan-sysop alan-sysop 64 Mar 18 23:50 7faba0000000-7faba4000000 -> /memfd:pulseaudio (deleted) lrw-------. 1 alan-sysop alan-sysop 64 Mar 18 23:50 7faba4000000-7faba8000000 -> /memfd:pulseaudio (deleted) lrw-------. 1 alan-sysop alan-sysop 64 Mar 18 23:50 7faba8000000-7fabac000000 -> /memfd:pulseaudio (deleted) lrw-------. 1 alan-sysop alan-sysop 64 Mar 18 23:50 7fabac000000-7fabb0000000 -> /memfd:pulseaudio (deleted) $ sudo stat --dereference /proc/$(pgrep pulseaudio)/map_files/7fab98000000-7fab9c000000 File: /proc/25911/map_files/7fab98000000-7fab9c000000 Size: 67108864 Blocks: 0 IO Block: 4096 regular file Device: 5h/5d Inode: 2399078 Links: 0 Access: (0777/-rwxrwxrwx) Uid: ( 1000/alan-sysop) Gid: ( 1000/alan-sysop) Context: unconfined_u:object_r:user_tmp_t:s0 Access: 2018-03-18 23:47:48.714061694 +0000 Modify: 2018-03-18 23:47:48.713061683 +0000 Change: 2018-03-18 23:47:48.713061683 +0000 Birth: -
例如,至少可以看到沒有單獨的 memfd,至少由 FD 或記憶體映射直接保存,自己消耗千兆字節。不過,如果有一些更好的工具或腳本來解決這個問題,仍然會很好。
$ sudo du -aLh /proc/*/map_files/ /proc/*/fd/ | sort -h | tail du: cannot access '/proc/self/fd/3': No such file or directory du: cannot access '/proc/thread-self/fd/3': No such file or directory 108M /proc/10397/map_files/7f1e141b4000-7f1e1ad84000 111M /proc/14862/map_files/ 112M /proc/10397/map_files/ 113M /proc/18324/map_files/7efdda2fb000-7efddaafb000 121M /proc/18324/map_files/7efdea2fb000-7efdeaafb000 129M /proc/18324/map_files/7efdc82fb000-7efdc8afb000 129M /proc/18324/map_files/7efdd42fb000-7efdd4afb000 129M /proc/18324/map_files/7efde52fb000-7efde5afb000 221M /proc/26350/map_files/ 3.9G /proc/18324/map_files/ $ ps -x -q 18324 PID TTY STAT TIME COMMAND 18324 pts/1 S+ 0:00 journalctl -b -f $ ps -x -q 26350 PID TTY STAT TIME COMMAND 26350 ? Sl 4:35 /usr/lib64/firefox/firefox $ sudo ls -l /proc/18324/map_files/7efde52fb000-7efde5afb000 lr--------. 1 root root 64 Mar 19 00:32 /proc/18324/map_files/7efde52fb000-7efde5afb000 -> /var/log/journal/f211872a957d411a9315fd911006ef03/user-1001@c3f024d4b01f4531b9b69e0876e42af8-00000000002e2acf-00055bbea4d9059d.journal