IT/기초 지식

[Linux] 프로세스가 열려 있는 파일을 찾을 때 사용하는 lsof 명령어

개발자 두더지 2020. 10. 20. 22:55
728x90

lsof 명령어란?


 lsof 명령어는 LiSt Open Files에서 유래됐다. 이름 그대로 '프로세스가 열려있는 파일'을 표시하는 커맨드이다. 

 UNIX/Linux에서는 일반적인 파일뿐만 아니라 네트워크 소켓이나 디바이스 드라이버, 프로세스 정보도 '파일'으로써 다룬다. 따라서 열려 있는 파일을 조사하는 것으로 대기 포트나 네트워크의 맵핑 정보 등을 파악할 수 있다. lsof 명령어에 의해 '어떤 파일을 열고 있는 프로세스', '어떤 포트에 접근하고 있는 프로세스'를 특정하고 '불필요한 프로그램이 실행되고 있는지' '부정한 프로그램이 동작하고 있지는 않은지'를 알아 볼 수 있다.

 인수에 파일을 전달해 실행하면 그 파일을 사용중인 프로세스 ID(PID)의 목록이 출력된다.

 프로세스가 사용중인 포트를 확인하는 작성법은 아래와 같다.

lsof [ 옵션 [ : 포트번호 | 서비스 ]] [ 파일 | 프로세스 ]

※ "[ ]"는 생략가능한 인수를 표시한 것이다.  "|" 으로 구분된 항목은 어느쪽이든 1개를 지정하는 것이다. 

 

lsof 명령어의 주요 옵션


  lsof 명령어의 중요한 옵션은 다음의 표와 같다.

옵션 의미
-P 포트 번호를 서비스 명으로 변경하지 않는다.
-c 프로세스 명을 지정한다
-i 네트워크 소켓 파일을 표시한다
-n IP 주소를 표시한다
-p 프로세스 ID를 지정한다

 "-c' 옵션의 뒤에 프로세스 명을 지정하면 그 프로세스가 열고 있는 파일을 특정할 수 있다. 프로세스명이 아닌 PID로 지정하는 경우 "-p" 옵션을 이용한다.

 특정 포트를 확인할 경우 "-i"을 이용한다. 인수를 지정하지 않은 경우 모든 포트를 대상으로 사용의 유무를 확인할 수 있다. 포트로 특정하는 경우는 "i:XXXX"와 같이 포트 번호를 지정하면 된다.

 또한 lsof명령어로 표시할 수 있는 파일, 포트는 lsof 명령어를 실행하는 유저가 읽어들이기 권한을 가지고 있는 경우로만 한한다. 네트워크 소켓 파일은 일반 유저에 대해 읽기 권한이 주어져 있지 않기 때문에 많은 경우는 root 혹은 sudo 커맨드와 합쳐 관리자 권한에서 실행한다. 

 

대기 포트와 프로세스의 확인


 로컬 호스트의 대기 포트와 프로세스의 목록을 확인하고 싶은 경우는 네트워크 소켓 파일을 표시하는 옵션 '-i'를 인수없이 실행하면 된다.

 이때, IP 주소를 호스트명으로 변환되지 않도록 '-n'옵션을, 포트 번호를 서비스명으로 변환되지 않도록 '-P'옵션을 함께 지정하면 빠른 속도로 결과를 얻을 수 있다.

 출력되는 항목의 내용과 의미는 아래의 표와 같다.

항목 의미
COMMAND 실행중의 프로그램
PID 프로세스 번호
USER 실행 유저
FD 파일 디스크립터 (/proc/<PID>/fd) 
TYPE 파일 종류
DEVICE 디바이스 번호
SIZE/OFF 파일 사이즈
NODE 프로토콜
NAME 파일 혹은 포트

 대기상태의 포트는 '(LISTEN)' 으로 표시되어 있다. 아래의 실행 예를 살펴보자면, Samba 서버의 데몬 (smbd)가 대기상태이므로, 해당 포트와 프로세스 ID를 알 수 있다.

$ sudo lsof -i -n -P
COMMAND     PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
avahi-dae   742   avahi   12u  IPv4  16986      0t0  UDP *:5353 
avahi-dae   742   avahi   13u  IPv4  16987      0t0  UDP *:46148 
chronyd     757  chrony    1u  IPv4  16594      0t0  UDP *:123 
chronyd     757  chrony    2u  IPv6  16595      0t0  UDP *:123 
  ・
  ・
smbd      2198  root   27u  IPv4   7258      0t0  TCP *:445 (LISTEN)
smbd      2198  root   28u  IPv4   7260      0t0  TCP *:139 (LISTEN)
  ・
  ・

 

특정 포트로 실행중의 프로세스를 확인


 특정 포트 번호로 실행중의 프로세스를 조사하는 경우는 '-i:XX'의 방법으로 '-i' 옵션의 뒤에 포트 번호를 지정하면 된다. sshd는 22번, httpd는 80번 등 주요 서비스에는 포트 번호가 할당되어 있기 때문에 (well-known 포트) , 보통은 그 번호를 지정한다.

 또한 '-i' 옵션에는 포트 번호뿐만 아니라 서비스명도 지정할 수 있다. 예를 들어, ssh에 관해 서비스를 조사하는 경우에는 '-i:ssh'로 작성하면 된다.

 아래의 예에서는 22번 포트로 실행중인 프로세스를 표시하고 있다.

$ sudo lsof -i:22 -P
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    2364 root    3u  IPv4    918      0t0  TCP linbox.local:22->MBAir.local:61723 (ESTABLISHED)
sshd    2368   pi    3u  IPv4    918      0t0  TCP linbox.local:22->MBAir.local:61723 (ESTABLISHED)
sshd    2490 root    3u  IPv4   8220      0t0  TCP *:22 (LISTEN)

참고자료

www.atmarkit.co.jp/ait/articles/1510/05/news014.html#:~:text=lsof%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AF%E3%80%8CLiSt%20Open,%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%81%99%E3%80%82&text=%E5%BC%95%E6%95%B0%E3%81%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%B8%8E%E3%81%88,%E4%B8%80%E8%A6%A7%E3%81%8C%E5%87%BA%E5%8A%9B%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82

728x90