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