[linux] lsof 사용

lsof  lisopen files 약자로 시스템에서 열린 파일 목록을 알려주고 사용하는 프로세스, 디바이스 정보, 파일의 종류등 상세한 정보를 출력해 준다.

리눅스와 유닉스는 추상화된 파일 시스템(VFS – Virtual File System) 사용하므로 일반 파일, 디렉터리, 네트워크 소켓, 라이브러리, 심볼릭 링크 등도 모두 파일로 처리되며 lsof 에서 상세한 정보를 확인할 있다.

 

유닉스마다 고유의 lsof 비슷한 용도의 명령어가 있지만 명령어와 옵션이 제각각이고 출력 정보가 상이하여 OS 바뀌면 사용하기가 힘들다.

lsof 리눅스, AIX, Solaris, FreeBSD, Mac OS X 종류에 상관없이 일관된 옵션과 출력 형식을 갖는 장점이 있다.

 

 

모든 열린 파일 출력 

옵션 없이 lsof 실행하면 모든 열린 파일 정보를 출력한다.

lsof

COMMAND    PID      USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME

init         1      root  cwd       DIR              253,0     4096          2 /

init         1      root  rtd       DIR              253,0     4096          2 /

init         1      root  txt       REG              253,0   150352       3932 /sbin/init

init         1      root  mem       REG              253,0    65928     784927 /lib64/libnss_files-2.12.so

init         1      root  DEL       REG              253,0              784911 /lib64/libc-2.12.so

init         1      root  DEL       REG              253,0              785325 /lib64/libgcc_s-4.4.7-20120601.so.1.#prelink#.YDRQV5

init         1      root  DEL       REG              253,0              784939 /lib64/librt-2.12.so

init         1      root  DEL       REG              253,0              784935 /lib64/libpthread-2.12.so.#prelink#.0jHMuJ

init         1      root  DEL       REG              253,0              785344 /lib64/libdbus-1.so.3.4.0.#prelink#.HCYJdq

init         1      root  mem       REG              253,0    39896     785047 /lib64/libnih-dbus.so.1.0.0

init         1      root  mem       REG              253,0   101920     785049 /lib64/libnih.so.1.0.0

init         1      root  DEL       REG              253,0              784904 /lib64/ld-2.12.so

init         1      root    0u      CHR                1,3      0t0       4160 /dev/null

init         1      root    1u      CHR                1,3      0t0       4160 /dev/null

init         1      root    2u      CHR                1,3      0t0       4160 /dev/null

init         1      root    3r     FIFO                0,8      0t0       8845 pipe

init         1      root    4w     FIFO                0,8      0t0       8845 pipe

init         1      root    5r      DIR               0,10        0          1 inotify

init         1      root    6r      DIR               0,10        0          1 inotify

init         1      root    7u     unix 0xffff880037504680      0t0       8846 socket

컬럼별 의미는 다음과 같다.

  1. COMMAND : 실행한 명령어
  2. PID : process id
  3. USER : 실행한 사용자
  4. FD: File Descriptor, 파일의 종류
  1. cwd: current working directory
  2. rtd: root directory
  3. mem : memory-mapped file
  4. txt: program text (code and data);
  5. TYPE: 파일 종류
  1. DIR: 디렉터리
  2. CHR:  character special file
  3. REG: regular file
  4. unix: 유닉스 도메인 소켓 (MySQL 등이 사용하는 소켓으로 로컬 프로세스에서만 사용 가능하며 TCP/UDP 보다 속도가 매우 빠름)
  5. DEVICE : 장치 번호
  6. SIZE/OFF: 파일의 크기나 오프셋
  7. NODE: 노드 번호
  8. NAME:  파일명

 

특정 사용자의 열린 파일 출력 

-u 옵션으로 사용자를 지정할 있다.

lsof -u lesstif

COMMAND  PID    USER   FD   TYPE             DEVICE SIZE/OFF    NODE NAME

sshd    7320 lesstif  cwd    DIR              253,0     4096       2 /

sshd    7320 lesstif  rtd    DIR              253,0     4096       2 /

sshd    7320 lesstif  txt    REG              253,0   546680  931362 /usr/sbin/sshd

sshd    7320 lesstif  DEL    REG                0,4            22174 /dev/zero

sshd    7320 lesstif  mem    REG              253,0    18592  785075 /lib64/security/pam_limits.so

sshd    7320 lesstif  mem    REG              253,0    10224  785073 /lib64/security/pam_keyinit.so

sshd    7320 lesstif  mem    REG              253,0    10240  785078 /lib64/security/pam_loginuid.so

sshd    7320 lesstif  mem    REG              253,0    18664  785090 /lib64/security/pam_selinux.so

sshd    7320 lesstif  mem    REG              253,0    41088  925568 /usr/lib64/libcrack.so.2.8.1

sshd    7320 lesstif  mem    REG              253,0    14432  785059 /lib64/security/pam_cracklib.so

 

특정 포트를 사용하는 프로세스 정보 보기

개인적으로 가장 많이 쓰는 명령어이다. -i 옵션뒤에 프로토콜과 포트를 명시해 주면 된다. 다음은 TCP 22 포트(ssh) 쓰는 프로세스의 정보를 출력한다.

lsof -i TCP:22

COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

sshd    1550    root    3u  IPv4  13931      0t0  TCP *:ssh (LISTEN)

sshd    1550    root    4u  IPv6  13933      0t0  TCP *:ssh (LISTEN)

sshd    1895    root    3r  IPv4  15005      0t0  TCP 192.168.152.131:ssh->192.168.152.1:55859 (ESTABLISHED)

sshd    7316    root    3r  IPv4  22126      0t0  TCP 192.168.152.131:ssh->192.168.152.1:57127 (ESTABLISHED)

sshd    7320 lesstif    3u  IPv4  22126      0t0  TCP 192.168.152.131:ssh->192.168.152.1:57127 (ESTABLISHED)

sshd    7474    root    3r  IPv4  22763      0t0  TCP 192.168.152.131:ssh->192.168.152.1:57197 (ESTABLISHED)

특정 명령어가 사용하는 포트

apache httpd 같은 경우 fork 하여 여러 개의 프로세스가 뜨게 된다. -c 옵션과 httpd 주면 httpd 오픈한 파일 정보를 출력한다.

lsof -c httpd

특정 파일을 사용하는 프로세스 보기

특정 파일을 사용하고 있는 프로세스의 자세한 정보를 있다. 옵션 없이 파일의 경로를 지정하면 된다.

lsof /var/log/httpd/access_log

 

특정 디렉터리내 열린 파일 보기

특정 디렉터리 하위의 열린 파일을 표시하고 싶은 경우가 있다. +D 옵션 뒤에 디렉터리 경로를 명시하면 된다. 아래는 /tmp 디렉터리 밑에 열린 파일을 표시한다.

lsof +D /tmp

 

포트 범위 지정

TCP 포트 22 에서 80 까지 출력

lsof -i TCP:22-80

COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

master  1349    root   12u  IPv4  12888      0t0  TCP localhost:smtp (LISTEN)

master  1349    root   13u  IPv6  12890      0t0  TCP localhost:smtp (LISTEN)

sshd    1550    root    3u  IPv4  13931      0t0  TCP *:ssh (LISTEN)

sshd    1550    root    4u  IPv6  13933      0t0  TCP *:ssh (LISTEN)

sshd    1895    root    3r  IPv4  15005      0t0  TCP 192.168.152.131:ssh->192.168.152.1:55859 (ESTABLISHED)

sshd    7316    root    3r  IPv4  22126      0t0  TCP 192.168.152.131:ssh->192.168.152.1:57127 (ESTABLISHED)

sshd    7320 lesstif    3u  IPv4  22126      0t0  TCP 192.168.152.131:ssh->192.168.152.1:57127 (ESTABLISHED)

httpd   7400    root    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7402  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7403  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7404  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7405  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7406  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7407  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7408  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7409  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

sshd    7474    root    3r  IPv4  22763      0t0  TCP 192.168.152.131:ssh->192.168.152.1:57197 (ESTABLISHED)

 

IPv4 또는 IPv6 포트만 표시

-i 옵션 뒤에 4(IPv4), 또는 6(IPV6) 지정하여 특정 IP 버전만 확인할 있다./

lsof -i 4

COMMAND    PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

rpcbind   1068     rpc    6u  IPv4  11858      0t0  UDP *:sunrpc 

rpcbind   1068     rpc    7u  IPv4  11860      0t0  UDP *:819 

rpcbind   1068     rpc    8u  IPv4  11861      0t0  TCP *:sunrpc (LISTEN)

rpc.statd 1086 rpcuser    5r  IPv4  11949      0t0  UDP *:838 

rpc.statd 1086 rpcuser    8u  IPv4  11955      0t0  UDP *:47492 

rpc.statd 1086 rpcuser    9u  IPv4  11959      0t0  TCP *:38374 (LISTEN)

cupsd     1159    root    7u  IPv4  12195      0t0  TCP localhost:ipp (LISTEN)

 

특정 사용자 제외

사용자 지정 옵션인 -u ^ 추가하면 특정 사용자는 제외할 있다. 다음은 lesstif root 사용자가 열은 파일은 제외하고 정보를 출력한다.

lsof -u^lesstif -u ^root

 

열린 모든 네트워크 포트 표시

모든 네트워크 포트를 표시한다. -i 뒤에 프로토콜을 명시하면 해당 프로토콜 관련 포트만 표시한다.

## 모든 포트

lsof -i

## TCP

lsof -i TCP 

## UDP

lsof -i UDP

특정 프로세스가 오픈한 파일 표시

특정 프로세스가 오픈한 파일만 표시한다. -p(소문자) 옵션뒤에 PID  주면 된다.

lsof -p 123

 

특정 사용자가 오픈한 모든 프로세스 중지

-t 옵션은 자세한 정보를 출력하지 않고 pid 정보만 출력한다. 다음 명령은 lesstif 사용자로 구동한 프로세스의 id 리턴한다.

lsof -t -u lesstif

13324

이를 응용하여 kill 명령어에 pid 전달할 있으므로 아래와 같이 사용하면 lesstif 사용자의 모든 프로세스를 중지하게 된다.

kill -KILL `lsof -t -u lesstif`

 

Ref

글쓴이