어떤 경우에는 "lsof"의 FD 열에 FD 번호 대신 DEL이 표시됩니다.

어떤 경우에는 "lsof"의 FD 열에 FD 번호 대신 DEL이 표시됩니다.
  1. 무슨 뜻이에요?
  2. 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 lsofDEL해당 열은 기록되지 않고 해당 열의 값만 TYPE기록됩니다 FD.

답변1

lsof일반적으로 Linux /proc/<PID>/maps파일 mem의 항목을 보고합니다.유형FD 칼럼. 그러나 프로세스 파일에 경로가 lsof없고 파일 항목에 파일이 열린 후 삭제되었음을 나타내는 .가 포함되어 있는 경우 파일 은 .stat(2)mapsmaps(deleted)lsofDEL

https://stackoverflow.com/a/37160579/1601027@don_crissti가 지적했듯이.


lsof루트로 실행하더라도 이러한 파일의 크기를 표시할 수 없습니다. (내 lsof버전은 4.89입니다.)

그러나 충분히 새로운 커널과 액세스 권한이 있는 경우 개별 파일에서 root매핑을 확인 ls -l /proc/$PID/map_files/하고 실행하여 크기를 표시할 수 있습니다. stat --dereference이는 "삭제된" 매핑 파일에서 사용되는 리소스를 확인하는 데 사용할 수 있습니다. 특히 memfd파일 시스템에 나타나지 않으며 항상 (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

관련 정보