Linux

lsof

진공청소ㄱl 2025. 3. 24. 19:32

lsof는 "List Open Files"의 약자로, 리눅스 및 유닉스 계열 운영 체제에서 현재 시스템에서 열려 있는 파일과 그 파일을 사용하는 프로세스에 대한 정보를 보여주는 유틸리티이다.

 

lsof는 시스템에서 열려 있는 모든 파일의 목록(일반 파일, 디렉토리, 소켓, 장치 파일 등)을 제공하며, 각 파일을 열고 있는 프로세스의 PID(프로세스 ID), 사용자, 파일의 접근 모드(읽기, 쓰기 등) 등의 정보를 포함한다.

 

각 헤더의 의미


COMMAND     PID   USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME

 

COMAND : 프로세스/명령어의 이름

 

PID : 프로세스의 고유 식별 번호

 

USER : 프로세스를 실행한 사용자의 이름 (프로세스 소유자)

 

FD : 파일 디스크립터

기본 입출력 (0-2)
- 0: stdin (표준 입력)
- 1: stdout (표준 출력)
- 2: stderr (표준 에러)

접근 모드
- r: 읽기 전용
- w: 쓰기 전용
- u: 읽기/쓰기 가능

특수 디스크립터
- cwd: 현재 작업 디렉토리
- txt: 프로그램 코드와 데이터
- mem: 메모리 매핑된 파일

추가 디스크립터 (3번~)
- 3: 주로 로그 파일용
- 4: 주로 네트워크 소켓용
- 5 이상: 추가 파일들

 

TYPE (파일 유형)

  • DIR: 디렉토리
  • REG: 일반 파일
  • IPv4/IPv6: 네트워크 소켓
  • CHR: 문자 장치

DEVICE (장치 번호)

  • major,minor: 8,0
  • 장치의 주번호,부번호 형식

SIZE/OFF (크기/오프셋)

  • bytes: 4096 (파일 크기)
  • offset: 0t0 (파일 오프셋)

NODE (inode)

  • number: 2048 (파일 시스템 내 고유 번호)

NAME (경로)

  • path: /etc/passwd (파일 경로)
  • network: TCP:80 (네트워크 연결 정보)

 

자주 사용하는 옵션


  • i: 파일과 관련된 네트워크 연결을 보여준다.
  • u: 특정 사용자가 열어 둔 파일을 보여준다.
  • p: 특정 프로세스가 열어 둔 파일을 보여준다.
  • c: 특정 명령어나 프로세스 이름으로 실행 중인 프로세스의 파일을 보여즌다.
  • t: 파일을 열고 있는 프로세스의 PID만 출력한다.

lsof -i

 

파일과 관련된 네트워크 연결의 server/client측 ip 주소와 port 까지 확인이 가능하다. 주로 포트 충돌 확인이나 네트워크 문제 해결, 비정상 연결 탐지 등의 목적으로 사용된다.

## lsof -i or lsof -i TCP:54790 

COMMAND    PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
mysql   124183 ubuntu    3u  IPv4 1086053   0t0    TCP ...mysql (ESTABLISHED)

 

lsof -u [사용자명]

 

특정 사용자가 연 파일을 보여준다. 주로 특정 사용자가 어떤 파일을 사용하는지 확인할 때 사용된다.

## lsof -u mysql

COMMAND   PID   USER   FD       TYPE        DEVICE      SIZE/OFF    NODE        NAME

mysqld  1250 mysql  cwd       DIR              202,1     4096 262675 /var/lib/mysql
mysqld  1250 mysql  rtd       DIR              202,1     4096      2 /
mysqld  1250 mysql  txt       REG              202,1 55249608  33428 /usr/sbin/mysqld
mysqld  1250 mysql  mem       REG              202,1 30795392   6305 /usr/lib/x86_64-linux-gnu/libicudata.so.74.2
mysqld  1250 mysql  mem       REG              202,1  2125328  33886 /usr/lib/x86_64-linux-gnu/libc.so.6
mysqld  1250 mysql  mem       REG              202,1    14640 262540 /usr/lib/mysql/plugin/auth_socket.so

 

lsof -p [포트명]

 

특정 프로세스 ID(PID)가 사용 중인 모든 파일과 리소스를 확인할 때 사용한다. 주로 프로세스 디버깅 시 해당 프로세스가 어떤 파일을 열었는지, 어떤 라이브러리를 사용하는지 확인할 때 사용한다.

## lsof -u 1250

COMMAND   PID   USER   FD       TYPE        DEVICE      SIZE/OFF    NODE        NAME

mysqld  1250 mysql  cwd       DIR              202,1     4096 262675 /var/lib/mysql
mysqld  1250 mysql  rtd       DIR              202,1     4096      2 /
mysqld  1250 mysql  txt       REG              202,1 55249608  33428 /usr/sbin/mysqld
mysqld  1250 mysql  mem       REG              202,1 30795392   6305 /usr/lib/x86_64-linux-gnu/libicudata.so.74.2
mysqld  1250 mysql  mem       REG              202,1  2125328  33886 /usr/lib/x86_64-linux-gnu/libc.so.6
mysqld  1250 mysql  mem       REG              202,1    14640 262540 /usr/lib/mysql/plugin/auth_socket.so

 

lsof -c [명령어]

 

특정 명령어나 프로세스 이름으로 시작하는 프로세스의 열린 파일을 보여준다. 특정 애플리케이션이나 서비스의 전반적인 리소스 사용 현황을 파악하거나, 여러 인스턴스가 실행 중일 때 전체적인 상태를 모니터링하는데 사용한다. 대소문자를 구분하지 않는다.

## lsof -c "mysql"

COMMAND   PID   USER   FD       TYPE        DEVICE      SIZE/OFF    NODE        NAME

mysqld  1250 mysql  cwd       DIR              202,1     4096 262675 /var/lib/mysql
mysqld  1250 mysql  rtd       DIR              202,1     4096      2 /
mysqld  1250 mysql  txt       REG              202,1 55249608  33428 /usr/sbin/mysqld
mysqld  1250 mysql  mem       REG              202,1 30795392   6305 /usr/lib/x86_64-linux-gnu/libicudata.so.74.2
mysqld  1250 mysql  mem       REG              202,1  2125328  33886 /usr/lib/x86_64-linux-gnu/libc.so.6
mysqld  1250 mysql  mem       REG              202,1    14640 262540 /usr/lib/mysql/plugin/auth_socket.so

 

lsof -t

 

파일을 열고 있는 프로세스의 PID만 출력한다. 주로 다른 명령어와 함께 파이프라인으로 연결하여 사용된다. 예를 들어 kill $(lsof -t -i:8080)와 같이 사용하면 8080 포트를 사용하는 프로세스를 쉽게 종료할 수 있다.

## lsof -t -c "mysql"

1250
125326