lsof 는 list open files 의 약자로 시스템에 열린 파일 목록을 알려주고 사용하는 프로세스, 디바이스 정보, 파일의 종류등 상세한 정보를 출력해 준다.
리눅스와 유닉스는 추상화된 파일 시스템(VFS - Virtual File System)을 사용하므로 일반 파일, 디렉터리, 네트워크 소켓, 라이브러리, 심볼릭 링크 등도 모두 파일로 처리되므로 lsof 에서 상세한 정보를 확인할 수 있다.
유닉스마다 lsof 와 비슷한 용도의 고유 명령어가 있지만 명령어와 옵션이 제각각이고 출력 정보가 상이하여 OS 가 바뀌면 사용하기가 힘들다.
lsof 는 리눅스, AIX, Solaris, FreeBSD, Mac OS X 등 종류에 상관없이 일관된 옵션과 출력 형식을 갖는 장점이 있다.
lsof 의 용도에 대해 설명했으니 많이 쓰이는 용법에 대해서 알아보자.
모든 열린 파일 출력
lsof 를 옵션없이 실행하면 모든 열린 파일 정보를 출력한다.
헤더 컬럼의 의미는 다음과 같다.
- COMMAND : 실행한 명령어
- PID : process id
- USER : 실행한 사용자
- FD: 파일 기술자(File Descriptor)
- cwd: 현재 작업 디렉터리
- rtd: 루트 디렉터리
- mem : memory-mapped file
- txt: program text (code and data);
- TYPE: 파일 종류
- DIR: 디렉터리
- CHR: character special file
- REG: regular file
- unix: 유닉스 도메인 소켓 (MySQL 등이 사용하는 소켓으로 로컬 프로세스에서만 사용 가능하며 TCP/UDP 보다 속도가 매우 빠름)
- DEVICE : 장치 번호
- SIZE/OFF: 파일의 크기나 오프셋
- NODE: 노드 번호
- NAME: 파일명
여기에서 눈 여겨 보아야 할 컬럼은 1번 COMMAND와 3번 USER , 4번 TYPE, 9번 NAME이다. 어떤 명령어와 사용자가 어떤 경로의 파일을 열었는지 확인하는데 필요한 항목이다.
특정 사용자의 열린 파일 출력
-u 옵션으로 특정 사용자가 열은 파일만 출력하게 지정할 수 있다.
특정 포트를 사용하는 프로세스와 파일 정보 보기
서버가 제대로 구동 안 됐을때 주요 원인중 하나는 해당 포트를 사용하는 프로세스가 이미 있는 경우이다. 또 정상적으로 구동됐는지 확인하는 방법중 서버가 사용하는 포트가 열렸는지이다.
lsof 를 -i 옵션뒤에 프로토콜과 포트를 명시해 주면 해당 프로토콜의 포트를 사용하는 프로세스 정보를 확인할 수 있다. 다음은 TCP 22번 포트(ssh)를 쓰는 프로세스의 정보를 출력한다.
프로세스 ID 가 열은 파일 보기
-p(소문자) 옵션뒤에 PID 를 주면 PID 에 해당하는 프로세스가 오픈한 파일만 표시한다. 다음은 PID 가 12345 인 프로세스가 열은 파일 목록을 출력한다.
특정 명령어가 열은 파일 보기
apache httpd 같은 경우 fork 하여 여러 개의 프로세스가 뜨게 되므로 여러 번의 -p 옵션을 쳐야 한다. -c 옵션과 함께 httpd 를 주면 httpd 명령어가 오픈한 모든 파일 정보를 출력한다.
lsof 는 프로세스를 보는 명령어인 ps 나 내트워크의 연결 상태나 포트를 보는 명령어인 netstat 보다 더 자세한 정보를 제공해 주며 다른 유닉스에도 이식되어 있으므로 OS 가 바뀌어도 편리하게 사용할 수 있다.
특히 특정 프로세스가 사용하는 파일을 찾거나 특정 포트를 점유하고 있는 프로세스를 찾는 등 문제 발생시 원인 분석에 매우 쓸모가 많으므로 잘 익혀 놓을 필요가 있다.