리눅스

lsof ( list open files)

정지홍 2024. 7. 10. 10:32

lsof

  • 시스템에서 열려있는 파일에 대한 정보를 출력하는 명령어
  • 일반 파일과 디렉토리,소켓,파이프,블록 디바이스에 대한 관리를 파일 시스템을 통해서 할수있음
  • 즉, 특정 프로세스가 열고 있는 fd를 조회하는 것이며 시스템을 모니터링하는데 도움됨
  • ex) 프로세스가 열고 있는 파일을 지웠을때 ls로 보이지 않으나 실제로 안지워지고 남아있는 경우가 존재하며, 이렇게 되면 해당 process가 열어 둔 파일이 위치한 디스크가 정상적으로 언마운트 안됨. 그래서 조회를 해야함.

 

[root@localcentos ~]# yum install lsof
# 우선 설치해야함

[root@localcentos ~]# lsof
COMMAND     PID  TID    USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1         root  cwd       DIR              253,0       224         64 /
systemd       1         root  rtd       DIR              253,0       224         64 /
systemd       1         root  txt       REG              253,0   1632776     316460 /usr/lib/systemd/systemd
systemd       1         root  mem       REG              253,0     20064      85768 /usr/lib64/libuuid.so.1.3.0
systemd       1         root  mem       REG              253,0    265576     257528 /usr/lib64/libblkid.so.1.1.0
systemd       1         root  mem       REG              253,0     90248      42131 /usr/lib64/libz.so.1.2.7
#시스템에 있는 모든 열린 파일에 대해서 출력

 

 

  • COMMAND 실행한 명령어
  • PID 프로세스 아이디
  • USER 명령어를 실행한 사용자
  • FD 파일디스크럽터 종류
  • TYPE 파일의 종류
  • DEVICE 디바이스 번호
  • SIZE/OFF 파일의 크기 or 현재 오프셋
  • NODE 아래중에 하나
    • 로컬 파일의 노드 번호
    • 서버 호스트에서 NFS 파일의 iNode 번호
    • 인터넷 프로토콜 타입
    • 리눅스 소켓 디바이스의 INode번호 or IRQ
  • NAME 파일 이름

파일 디스크럽터 종류

  • Lnn : Library references
  • err : FD information error
  • jld : jail directory
  • ltx : shared Library text
  • Mxx : Hex memory-mapped type number xx
  • mem : memory-mapped file
  • mmap : memory-mapped device
  • pd : parent dir
  • red : root dir
  • tr : kernel trace file
  • txt : program text (code and data)
  • NUMBER : 숫자만 오는 경우
    • 숫자는 FD번호
    • 뒤에 오는 문자 의미
      • r : read access
      • w : write access
      • u : read n write access

 

=======-u 옵션===특정 사용자에 대한 조회===========
[root@localcentos ~] # lsof -u root
# -u 옵션은 특정 사용자가 오픈한 파일을 출력한다.

=======-u^ 옵션===특정 사용자를 제외하고 조회===========
[root@localcentos ~] # lsof -u^root
# -u^ 옵션은 특정 사용자를 제외한 나머지 사용자가 오픈한 파일 출력


========l옵션======계정이름이 아니라 유저아이디로 바꿔서 출력======
[root@localcentos ~]# lsof -l


======path 옵션=====특정 경로에서 오픈한 프로세스 조회=========
[root@localcentos ~] # lsof /dev/pts
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    16637 root    0u   CHR  136,2      0t0    5 /dev/pts/2
bash    16637 root    1u   CHR  136,2      0t0    5 /dev/pts/2
bash    16637 root    2u   CHR  136,2      0t0    5 /dev/pts/2
# 특정한 경로를 주면 해당 경로의 오픈된 프로세스들을 출력

========+D 옵션====특정 디렉토리에서 오픈 한 파일들 보기=======
[root@localcentos ~] # lsof +D /bin
COMMAND     PID USER  FD   TYPE DEVICE SIZE/OFF      NODE NAME
dbus-daem   721 dbus txt    REG  253,0   223232 101262403 /usr/bin/dbus-daemon
VGAuthSer   735 root txt    REG  253,0   132600 101373061 /usr/bin/VGAuthService
# 특정 디렉토리의 열린 파일 보기


================-i 4옵션=====ipv4=======
[root@localcentos ~] # lsof -i 4
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
master    1321 root   13u  IPv4  21907      0t0  TCP localhost:smtp (LISTEN)
ntpd     10938  ntp   16u  IPv4  42167      0t0  UDP *:ntp 
ntpd     10938  ntp   18u  IPv4  42173      0t0  UDP localhost:ntp 
ntpd     10938  ntp   19u  IPv4  65621      0t0  UDP localcentos:ntp 
sshd     15123 root    3u  IPv4  44020      0t0  TCP *:ssh (LISTEN)
sshd     16625 root    3u  IPv4  54055      0t0  TCP 172.16.25.132:ssh->172.16.25.1:53011 (ESTABLISHED)
# -i 4는 ipv4로 오픈한 소켓에 대한 정보들이 나온다.

================-i 6옵션=====ipv6=======
[root@localcentos ~] # lsof -i 6
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
master   1321   root   14u  IPv6  21908      0t0  TCP localhost:smtp (LISTEN)
ntpd    10938    ntp   17u  IPv6  42168      0t0  UDP *:ntp 
ntpd    10938    ntp   20u  IPv6  42175      0t0  UDP localhost:ntp 
# -i 6는 ipv6에 대한 정보를 알수있음.


======i옵션   ========특정 프로토콜과 포트정보를 출력=======
[root@localcentos ~] # lsof -i
COMMAND    PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
master    1321   root   13u  IPv4  21907      0t0  TCP localhost:smtp (LISTEN)
master    1321   root   14u  IPv6  21908      0t0  TCP localhost:smtp (LISTEN)
ntpd     10938    ntp   16u  IPv4  42167      0t0  UDP *:ntp 
ntpd     10938    ntp   17u  IPv6  42168      0t0  UDP *:ntp 
ntpd     10938    ntp   18u  IPv4  42173      0t0  UDP localhost:ntp 
ntpd     10938    ntp   19u  IPv4  65621      0t0  UDP localcentos:ntp 
ntpd     10938    ntp   20u  IPv6  42175      0t0  UDP localhost:ntp 
# 모든 네트워크에 대한 정보를 얻는다.
# 이외에도 -i TCP , -i UDP는 해당 포트를 확인할수있다
# 예를 들어서 lsof -i TCP:22입력시 22번 포트를....
# 1024:2048입력시 1024~2048에 대한 정보를 얻는다.


============c옵션====특정 명령어를 사용하고 있는 정보를 출력=======
[root@localcentos ~] # lsof -c sshd
COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF     NODE NAME
sshd    15123 root  cwd    DIR              253,0      224       64 /
sshd    15123 root  rtd    DIR              253,0      224       64 /
sshd    15123 root  txt    REG              253,0   852856   395964 /usr/sbin/sshd
# 특정 명령어가 사용하는 파일 정보를 얻으려면 -c옵션을 주면 됨


=======p옵션=============특정 pid가 참조하는것들을 출력=======
[root@localcentos ~] # lsof -p 20367
COMMAND   PID USER   FD   TYPE DEVICE  SIZE/OFF      NODE NAME
bash    20367 root  cwd    DIR  253,0      4096  67149889 /root
bash    20367 root  rtd    DIR  253,0       224        64 /
bash    20367 root  txt    REG  253,0    964536 100666964 /usr/bin/bash
bash    20367 root  mem    REG  253,0     61560     36459 /usr/lib64/libnss_files-2.17.so
bash    20367 root  mem    REG  253,0 106172832 100666955 /usr/lib/locale/locale-archive
bash    20367 root  mem    REG  253,0   2156272     36441 /usr/lib64/libc-2.17.so
bash    20367 root  mem    REG  253,0     19248     36447 /usr/lib64/libdl-2.17.so
bash    20367 root  mem    REG  253,0    174576     42114 /usr/lib64/libtinfo.so.5.9
bash    20367 root  mem    REG  253,0    163312     36434 /usr/lib64/ld-2.17.so
# -p pid는 특정 프로세스가 사용하는 정보를 얻음

==============d옵션======해당 fd기준으로 정보를 출력=======
[root@localcentos ~]# lsof -d 0
COMMAND     PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd       1    root    0u   CHR    1,3      0t0 1028 /dev/null
systemd-j   515    root    0r   CHR    1,3      0t0 1028 /dev/null
lvmetad     540    root    0r   CHR    1,3      0t0 1028 /dev/null

=======-t옵션===== 특정 경로를 주면 해당 경로의 파일을 오픈한 프로세스ID를 얻을수있음====
[root@localcentos /]# lsof -t /root
20367
# -t옵션은 특정 경로를 주면 해당 경로의 파일을 오픈한 프로세스ID를 얻을수있음