본문 바로가기
Old Posts/Linux

[Linux] lsof 명령어 설치 및 사용법

by A6K 2021. 2. 18.

lsof는 list open files의 약자로 시스템에서 열려있는 파일에 대한 정보를 출력해주는 명령어다. (대략 '엘에스오브'라고 발음하는 것 같다) 리눅스와 유닉스는 일반 파일과 디렉토리, 소켓, 파이프, 블록 디바이스, 캐릭터 디바이스에 대한 관리를 파일 시스템을 통해서 할 수 있다. 따라서 특정 프로세스가 열고 있는 파일 디스크립터(fd)를 조회해보는 행위는 시스템을 모니터링하는데 굉장한 도움이 된다.

유닉스 계열의 운영체제에서는 프로세스가 열고 있는 파일을 지웠을 때, 파일 시스템에서 ls로 보이지는 않지만 reference count가 0이 아니기 때문에 실제로 지워지지 않고 남아있는 경우가 더러 있다. 이 때, 프로세스가 열고 있는 파일이 위치한 디스크를 정상적으로 언마운트할 수 없기 때문에 누가 쓰고 있는지 조회해야하는 경우가 있다. 이 때, lsof를 사용하면 쉽게 찾을 수 있다.

1. lsof 설치

lsof는 패키지 매니저를 통해서 쉽게 설치할 수 있다. CentOS의 경우

sudo yum install lsof

Ubuntu의 경우

sudo apt-get install lsof

이 명령어로 lsof를 설치할 수 있다.

2. lsof 실행 결과

옵션 없이 lsof 명령을 실행하면 시스템에 있는 모든 열린 파일들에 대한 정보를 출력해준다. (따라서 lsof 명령을 일반 유저가 사용할 수 있게 퍼미션 설정하는 것을 권장한다.)

# lsof
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
bash      1 root  cwd    DIR  0,108     4096   16847 /
bash      1 root  rtd    DIR  0,108     4096   16847 /
bash      1 root  txt    REG    8,1  1113504 3151309 /bin/bash
bash      1 root  mem    REG    8,1    47568 3414744 /lib/x86_64-linux-gnu/libnss_files-2.27.so
bash      1 root  mem    REG    8,1    97176 3414738 /lib/x86_64-linux-gnu/libnsl-2.27.so
bash      1 root  mem    REG    8,1    47576 3414748 /lib/x86_64-linux-gnu/libnss_nis-2.27.so
bash      1 root  mem    REG    8,1    39744 3414740 /lib/x86_64-linux-gnu/libnss_compat-2.27.so
bash      1 root  mem    REG    8,1  2030544 3414702 /lib/x86_64-linux-gnu/libc-2.27.so
bash      1 root  mem    REG    8,1    14560 3414712 /lib/x86_64-linux-gnu/libdl-2.27.so
bash      1 root  mem    REG    8,1   170784 3414782 /lib/x86_64-linux-gnu/libtinfo.so.5.9
bash      1 root  mem    REG    8,1   170960 3414684 /lib/x86_64-linux-gnu/ld-2.27.so
bash      1 root    0u   CHR  136,0      0t0       3 /dev/pts/0
bash      1 root    1u   CHR  136,0      0t0       3 /dev/pts/0
bash      1 root    2u   CHR  136,0      0t0       3 /dev/pts/0
bash      1 root  255u   CHR  136,0      0t0       3 /dev/pts/0
lsof    251 root  cwd    DIR  0,108     4096   16847 /
lsof    251 root  rtd    DIR  0,108     4096   16847 /
lsof    251 root  txt    REG    8,1   163224 3149630 /usr/bin/lsof
lsof    251 root  mem    REG    8,1   144976 3414763 /lib/x86_64-linux-gnu/libpthread-2.27.so
lsof    251 root  mem    REG    8,1    14560 3414712 /lib/x86_64-linux-gnu/libdl-2.27.so
lsof    251 root  mem    REG    8,1   464824 3414760 /lib/x86_64-linux-gnu/libpcre.so.3.13.3
lsof    251 root  mem    REG    8,1  2030544 3414702 /lib/x86_64-linux-gnu/libc-2.27.so
lsof    251 root  mem    REG    8,1   154832 3414771 /lib/x86_64-linux-gnu/libselinux.so.1
lsof    251 root  mem    REG    8,1   170960 3414684 /lib/x86_64-linux-gnu/ld-2.27.so
lsof    251 root    0u   CHR  136,0      0t0       3 /dev/pts/0
lsof    251 root    1u   CHR  136,0      0t0       3 /dev/pts/0
lsof    251 root    2u   CHR  136,0      0t0       3 /dev/pts/0
lsof    251 root    3r   DIR  0,110        0       1 /proc
lsof    251 root    4r   DIR  0,110        0   31034 /proc/251/fd
lsof    251 root    5w  FIFO   0,10      0t0   31039 pipe
lsof    251 root    6r  FIFO   0,10      0t0   31040 pipe
lsof    252 root  cwd    DIR  0,108     4096   16847 /
lsof    252 root  rtd    DIR  0,108     4096   16847 /
lsof    252 root  txt    REG    8,1   163224 3149630 /usr/bin/lsof
lsof    252 root  mem    REG    8,1   144976 3414763 /lib/x86_64-linux-gnu/libpthread-2.27.so
lsof    252 root  mem    REG    8,1    14560 3414712 /lib/x86_64-linux-gnu/libdl-2.27.so
lsof    252 root  mem    REG    8,1   464824 3414760 /lib/x86_64-linux-gnu/libpcre.so.3.13.3
lsof    252 root  mem    REG    8,1  2030544 3414702 /lib/x86_64-linux-gnu/libc-2.27.so
lsof    252 root  mem    REG    8,1   154832 3414771 /lib/x86_64-linux-gnu/libselinux.so.1
lsof    252 root  mem    REG    8,1   170960 3414684 /lib/x86_64-linux-gnu/ld-2.27.so
lsof    252 root    4r  FIFO   0,10      0t0   31039 pipe
lsof    252 root    7w  FIFO   0,10      0t0   31040 pipe

출력되는 화면의 컬럼별 의미는 다음과 같다. (도커로 우분투를 띄워서 lsof를 설치한 다음 실행해봤다)

  • COMMAND : 실행한 명령어
  • PID : 프로세스 ID
  • USER : 명령어를 실행한 사용자
  • FD : File Descriptor의 종류
  • Lnn : Library references (AIX)
  • err : FD information error
  • jld : jail directory (FreeBSD)
  • ltx : Shared Library text (Code and data)
  • Mxx : Hex memory-mapped type number xx.
  • m86 : DOS Merge mapped file;
  • mem : memory-mapped file;
  • mmap : memory-mapped device;
  • pd : parent directory;
  • rtd : root directory;
  • tr : kernel trace file (OpenBSD);
  • txt : program text (code and data);
  • v86 : VP/ix mapped file;
  • NUMBER : 숫자가 오는 경우 (0u, 1u, 2u 같은..)
  • 숫자는 FD 번호
  • 뒤에 오는 문자의 의미
  • r : read access
  • w : write acces
  • u : read and write access
  • 예를 들어 '0u'라는 값은 0번 FD를 Read/Write 모드로 접근하고 있다는 의미
  • TYPE : 파일의 종류
  • DIR : 디렉토리
  • REG : Regular File
  • CHR : Character Special File
  • BLK : Block Special File
  • IPv4 : IPv4 Socket
  • IPv6 : IPv6 Socket
  • ax25 : Linux AX.25 Socket
  • inet : Internet domain socket
  • unix : UNIX domain socket
  • FIFO : FIFO Special File
  • KQUEUE : BSD style kernel event queue file
  • PSXSEM : POSIX semaphore file
  • PSXSHM : POSIX shared memory file
  • DEVICE : 디바이스 번호
  • SIZE/OFF : 파일의 크기 혹은 현재 오프셋
  • NODE : 다음 중 하나
  • 로컬 파일의 노드 번호
  • 서버 호스트에서 NFS 파일의 iNode 번호
  • 인터넷 프로토콜 타입
  • Linux AX.25 소켓 디바이스의 iNode 번호 혹은 IRQ
  • NAME : 파일 이름

자세한 것은 man lsof 명령을 이용하면 모두 알 수 있다.

3. lsof 옵션

옵션  설명
 -a  파일을 선택하는데 AND 연산으로 대상을 출력
 -c  지정한 COMMAND 필드만 출력
 -F  지정한 구분자로 필드를 구분하여 출력
 -g  지정한 그룹 아이디를 사용하는 관련 프로세스를 출력
 -i  현재 사용되는 소켓 정보를 출력
 -l  로그인 사용자명 대신에 UID를 출력
 -n  호스트명 대신에 IP주소를 출력
 -P  포트 서비스명 대신에 포트 번호를 출력
 -r  지정한 초의 주기로 반복해서 출력 (디폴트 값은 15초)
 -s  파일의 크기를 출력
 -V  보다 상세한 정보를 출력

4. lsof 사용 예제

일반적으로 옵션없이 lsof를 사용하면 출력되는 결과 값이 너무나도 많아서 한눈에 원하는 정보를 얻기 힘들다. 따라서 원하는 정보만 필터링해서 출력하도록 lsof 명령의 옵션을 숙지하고 있으면 편하다.

3.1 lsof 사용 패턴 - 특정 사용자가 오픈한 파일 출력

lsof의 -u 옵션으로 특정 사용자가 오픈한 파일들의 현황을 모니터링 할 수 있다. 예를 들어 'dave'라는 사용자가 연 파일 정보를 출력하려면 다음과 같이 명령어를 실행시키면 된다.

# lsof -u dave

3.2 lsof 사용 예제 - 특정 사용자를 제외한 나머지 사용자가 오픈한 파일 출력

-u 옵션의 반대도 가능하다. 즉 특정 사용자를 제외한 다른 모든 사용자들을 대상으로 lsof를 실행할 수도 있다. 예를 들어 Admin 사용자를 제외한 모든 일반 사용자들의 파일 사용 패턴을 모니터링하고 싶을 때가 있다.

-u 에 ^ 문자를 추가하면 포함하지 않겠다는 의미다. 예를 들어 root 유저와 admin 유저를 제외한 모든 유저에 대해 파일 오픈 정보를 확인하고 싶으면 다음 명령을 실행하면 된다.

# lsof -u^root -u ^admin

3.3 lsof 사용 패턴 - 특정 파일을 오픈한 프로세스 보기

lsof의 인자로 파일 경로를 주면 해당 파일을 오픈하고 있는 프로세스 리스트를 확인할 수 있다.

# lsof /dev/pts/0

3.4 lsof 사용 패턴 - 특정 디렉토리의 열린 파일 보기

+D 옵션으로 디렉터리 경로를 입력하면 해당 디렉토리에 속한 파일중 열린 파일들의 정보를 기준으로 프로세스 정보를 확인할 수 있다.

# lsof +D /bin

3.5 lsof 사용패턴 - 특정 포트를 사용하고 있는 프로세스 정보 보기

-i 옵션에 프로토콜 이름과 포트 번호를 명시해주면 특정 포트를 사용하는 프로세스 정보를 얻을 수 있다.

우선 -i 옵션 뒤에 숫자 4를 넣어주면 IPv4로 오픈한 소켓에 대한 정보들이 나온다.

# lsof -i 4

6을 넣으면 IPv6에 대한 정보를 얻을 수 있다.

# lsof -i 6

또 한 열려있는 모든 네트워크 포트 정보를 확인할 수도 있다. 열려있는 모든 네트워크 포트를 확인하기 위해서는 다음을 실행하자.

# lsof -i

열려있는 모든 TCP 포트를 확인하기 위해서는

# lsof -i TCP

비슷하게 UDP 포트도 확인할 수 있다.

프로토콜과 포트를 섞어서 확인해볼 수도 있다. 예를 들어 22번 포트로 ssh 연결을 한 프로세스들은 다음 명령어로 확인할 수 있다.

# lsof -i TCP:22

특정 범위의 포트 정보를 얻고 싶을 때는 대시문자('-')를 이용하면 된다. 예를 들어 1024 ~ 2048번 포트를 열고 있는 모든 프로세스 정보를 보고 싶으면

# lsof -i TCP:1024-2048

을 실행하면 된다.

3.6 lsof 사용패턴 - 특정 명령어가 사용하는 파일 정보

-c 옵션에 명령어 이름을 입력하여 파일 정보를 확인할 수 있다.

# lsof -c sshd

3.7 lsof 사용패턴 - 특정 프로세스가 사용하는 파일 정보

# lsof -p 1123

3.8 lsof 사용 예제 - PID 만 출력하기

lsof에 -t 옵션을 주면 PID만 출력한다. 이를 이용해서 다른 명령어의 인자로 lsof 결과를 넘길 수 있다. 예를들어 '/Users/user/temp/temp_file'라는 파일을 오픈한 프로세스 ID 만 출력하고 싶으면 -t 옵션을 다음과 같이 이용하면 된다.

# lsof -t /Users/user/temp/temp_file
11234

이 명령을 이용해서 '/Users/user/temp/temp_file'을 오픈한 모든 프로세스를 종료시키는 명령을 만들 수도 있다.

# kill -9 `lsof -t /Users/user/temp/temp_file`

3.9 lsof 사용패턴 - 여러 옵션 같이 사용하기

lsof는 여러 옵션을 같이 사용할 수 있다. 단 각 조건들은 기본적으로 or 조건으로 필터링 된다.

# lsof -p 55701 -p 44027

댓글