lsof
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