Profile picture

[Linux] lsof 명령어 사용법

JaehyoJJAng2023년 05월 21일

lsof

  • list open files

시스템에서 열린 파일 목록을 알려주고 사용하는 프로세스 , 디바이스 정보 , 파일의 종류등 상세한 정보를 출력

옵션 정리

옵션 없이 경로 지정

  • 특정 파일의 프로세스 출력
sudo lsof /home/docker 2>/dev/null | head -n 5

COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
tracker-m 51452 docker  cwd    DIR    8,5     4096 2883586 /home/docker
dbus-daem 51454 docker  cwd    DIR    8,5     4096 2883586 /home/docker
gvfsd     51467 docker  cwd    DIR    8,5     4096 2883586 /home/docker
gvfsd-fus 51477 docker  cwd    DIR    8,5     4096 2883586 /home/docker

-i 옵션

  • 4(Ipv4),또는 6(IPV6) 를 지정하여 특정 IP의 버전만 출력
sudo lsof -i 4 2>/dev/null

COMMAND     PID            USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
avahi-dae   829           avahi   12u  IPv4  42991      0t0  UDP *:mdns
...

-c 옵션

  • 특정 명령어를 사용하고 있는 정보 출력
sudo lsof -c ssh 2>/dev/null | head -n 5

sshd     1050   root  cwd    DIR                8,5     4096       2 /
sshd     1050   root  rtd    DIR                8,5     4096       2 /
sshd     1050   root  txt    REG                8,5   876328 3671153 /usr/sbin/sshd
sshd     1050   root  mem    REG                8,5    51856 3672241 /usr/lib/x86_64-linux-gnu/libnss_files-2.31.so

-d 옵션

  • 현재 사용중인 File Descriptor 기준으로 정보 출력
sudo lsof -d 0 2>/dev/null

COMMAND     PID             USER   FD   TYPE             DEVICE SIZE/OFF  NODE NAME
systemd       1             root    0u   CHR                1,3      0t0     5 /dev/null
bpfilter_   381             root    0r  FIFO               0,13      0t0 28079 pipe
vmware-vm   448             root    0u   CHR                1,3      0t0     5 /dev/null
VGAuthSer   797             root    0r   CHR                1,3      0t0     5 /dev/null
vmtoolsd    799             root    0r   CHR                1,3      0t0     5 /dev/null
accounts-   825             root    0r   CHR                1,3      0t0     5 /dev/null
acpid       826             root    0u  unix 0xffff907d5259d100      0t0 41030 /run/acpid.socket type=STREAM

+D 옵션

  • 특정 디렉토리의 열린 파일 정보 출력
sudo lsof +D /dev 2>/dev/null

COMMAND     PID             USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
systemd       1             root    0u   CHR     1,3      0t0    5 /dev/null
systemd       1             root    1u   CHR     1,3      0t0    5 /dev/null
systemd       1             root    2u   CHR     1,3      0t0    5 /dev/null

-g 옵션

  • 특정 그룹ID로 정보 출력
sudo lsof -g 1 2>/dev/null

systemd   1    1 root  cwd       DIR                8,5     4096          2 /
systemd   1    1 root  rtd       DIR                8,5     4096          2 /
...

-i 옵션

  • 특정 프로토콜과 포트 정보 출력
sudo lsof -i TCP 2>/dev/null

COMMAND     PID            USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
cupsd       942            root    6u  IPv6   45558      0t0  TCP ip6-localhost:ipp (LISTEN)
cupsd       942            root    7u  IPv4   45559      0t0  TCP localhost:ipp (LISTEN)
sshd       1050            root    3u  IPv4   47023      0t0  TCP *:ssh (LISTEN)
sshd       1050            root    4u  IPv6   47025      0t0  TCP *:ssh (LISTEN)
sudo lsof -i TCP:8080 2>/dev/null

COMMAND   PID    USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    70722 tomcat8   41u  IPv6 1039287      0t0  TCP *:http-alt (LISTEN)

-N 옵션

  • NFS에 연결되어 있는 파일 정보 출력
sudo lsof -N 2>/dev/null

-l 옵션

  • 소문자 l
  • 계정이름이 아닌 UID(숫자)로 변경되어 출력
sudo lsof -li TCP:8080 2>/dev/null

COMMAND   PID     USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    70722      127   41u  IPv6 1039287      0t0  TCP *:http-alt (LISTEN)

-n 옵션

  • 호스트 이름대신 IP로 정보 출력
sudo lsof -ni TCP:8080 2>/dev/null

-p 옵션

  • 특정 PID가 참조하고 있는 프로그램 파일, 라이브러리 출력
sudo lsof -p 2>/dev/null

-t 옵션

  • 동작하고 있는 프로세서들의 PID만 출력
sudo lsof -ti TCP:8080 2>/dev/null

70722

-T 옵션

  • TCP 프로토콜로 통신하는 소켓만 출력
sudo lsof -T 2>/dev/null | head -n 5

COMMAND     PID   TID TASKCMD               USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1                             root  cwd       DIR                8,5      4096          2 /
systemd       1                             root  rtd       DIR                8,5      4096          2 /
systemd       1                             root  txt       REG                8,5   1620224    3714751 /usr/lib/systemd/systemd
systemd       1                             root  mem       REG                8,5   1369384    3672193 /usr/lib/x86_64-linux-gnu/libm-2.31.so

-U 옵션

  • UDP 프로토콜로 통신하는 소켓만 출력
sudo lsof -U 2>/dev/null

-u 옵션

  • 특정 계정으로 열린 파일 출력
sudo lsof -u docker 2>/dev/null | head -n 3

COMMAND     PID   USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
systemd   51444 docker  cwd       DIR                8,5     4096          2 /
systemd   51444 docker  rtd       DIR                8,5     4096          2 /

예제

특정 포트 프로세스 찾기

특정 포트가 사용되어 프로그램이 실행되지 않을 때 어떤 프로그램이 점유하고 있는지 찾기가 난감하다.
이럴 때 lsof 명령어를 사용하여 특정 포트를 사용하는 프로세스를 찾아볼 수 있다.


사용방법

$ lsof -i:[port 번호]

예제를 실행해보도록 하자

$ lsof -i:5000
COMMAND   PID      USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ControlCe 622 jaehyolee    7u  IPv4 0xf3e1660bc2873ea3      0t0  TCP *:commplex-main (LISTEN)
ControlCe 622 jaehyolee    8u  IPv6 0xf3e1661092fb874b      0t0  TCP *:commplex-main (LISTEN)

이렇게 특정 포트를 사용하고 있는 프로세스를 간단하게 찾을 수 있었다. 5000번 포트를 사용하는 프로그램은 complex-main이고 PID는 622번 이다. 프로세스를 죽이고 싶으면 kill -KILL 622로 죽이면 된다

단, 해당 프로세스가 어떤 일을 하고 있는지, 프로세스를 죽였을 때 시스템에 문제는 없는지 잘 확인해야한다.


포트 범위 지정

TCP 포트 22번에서 80번까지 출력

$ lsof -i TCP:22-80

열린 파일 보기

특정 디렉토리 하위의 열린 파일을 표시하고 싶은 경우가 있을 수 있다. +D 옵션 뒤에 디렉토리 경로를 명시해주면 된다. 아래 예제는 /tmp 디렉토리 밑에 열린 파일을 표시하는 예제이다.

$ lsof +D /tmp

특정 사용자의 열린 파일도 출력이 가능하다. -u 옵션으로 사용자를 지정할 수 있다.

$ lsof -u vagrant

Loading script...