1. 개요

얼마전 파일 디스크립터에 대해 설명한 적이 있다.

http://sarc.io/index.php/miscellaneous/693

오늘은 관련된 명령어인 lsof에 대해 간단히 소개하고자 한다. lsof는 list open files라는 뜻으로 흔히 [엘에스오브]라고 발음하는 것 같다. 외국에서는 어떻게 발음하는지 아시는 분 있으면 제보 좀…


2. 설치

우선 yum을 이용하여 설치해보도록 하자.

# yum install lsof
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: ftp.daumkakao.com
 * extras: ftp.daumkakao.com
 * updates: ftp.daumkakao.com
base                                                                                                       | 3.7 kB     00:00
extras                                                                                                     | 3.4 kB     00:00
extras/primary_db                                                                                          |  37 kB     00:00
updates                                                                                                    | 3.4 kB     00:00
updates/primary_db                                                                                         | 2.6 MB     00:00
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package lsof.x86_64 0:4.82-5.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==================================================================================================================================
 Package                     Arch                          Version                              Repository                   Size
==================================================================================================================================
Installing:
 lsof                        x86_64                        4.82-5.el6                           base                        324 k

Transaction Summary
==================================================================================================================================
Install       1 Package(s)

Total download size: 324 k
Installed size: 900 k
Is this ok [y/N]: y
Downloading Packages:
lsof-4.82-5.el6.x86_64.rpm                                                                                 | 324 kB     00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : lsof-4.82-5.el6.x86_64                                                                                         1/1
  Verifying  : lsof-4.82-5.el6.x86_64                                                                                         1/1

Installed:
  lsof.x86_64 0:4.82-5.el6

Complete!

3. 실행

그럼 설치된 lsof를 실행해 보자.

# lsof
x
COMMAND     PID    USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
init          1    root  cwd       DIR              253,1      4096          2 /
init          1    root  rtd       DIR              253,1      4096          2 /
init          1    root  txt       REG              253,1    150352     917532 /sbin/init
init          1    root  mem       REG              253,1     65928     393290 /lib64/libnss_files-2.12.so
init          1    root  mem       REG              253,1   1921176     393227 /lib64/libc-2.12.so
init          1    root  DEL       REG              253,1               393560 /lib64/libgcc_s-4.4.7-20120601.so.1;5761fb6c
init          1    root  mem       REG              253,1     43880     393562 /lib64/librt-2.12.so
init          1    root  mem       REG              253,1    142640     393251 /lib64/libpthread-2.12.so
init          1    root  mem       REG              253,1    265728     393311 /lib64/libdbus-1.so.3.4.0
init          1    root  mem       REG              253,1     39896     393431 /lib64/libnih-dbus.so.1.0.0
init          1    root  mem       REG              253,1    101920     393433 /lib64/libnih.so.1.0.0
init          1    root  mem       REG              253,1    154624     393306 /lib64/ld-2.12.so
init          1    root    0u      CHR                1,3       0t0       3643 /dev/null
init          1    root    1u      CHR                1,3       0t0       3643 /dev/null
init          1    root    2u      CHR                1,3       0t0       3643 /dev/null
init          1    root    3r     FIFO                0,8       0t0       6488 pipe
init          1    root    4w     FIFO                0,8       0t0       6488 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 0xffff880037999680       0t0       6489 @/com/ubuntu/upstart
init          1    root    8u     unix 0xffff880037fe0380       0t0     424583 socket
init          1    root    9u     unix 0xffff88007c86a980       0t0       7715 socket

4. 해독

4-1. FD의 의미는 다음과 같다.

cwd 현재 디렉토리
txt 텍스트 파일
mem Memory Mapped 파일
mmap Memory Mapped 장치
NUMBER File Descriptor 번호, 숫자 뒤 r은 read, w은 write, u는 read/write를 의미

 

4-2. TYPE의 의미는 다음과 같다.

REG 일반 파일
DIR 디렉토리
FIFO 선입선출
REG 캐릭터 특수 파일

5. 명령어

  • 명령어 : $ lsof -p process명 | wc –l
  • 해당 프로세스가 사용하고 있는 총 fd 값임
    - 이 값은, ulimit -a에서 정의된 sw fd값을 넘을 수 없다.
    - 프로세스는 ulimit값 내에서 fd를 사용함으로 모자를 경우 성능 저하 원인이 된다.

6. 실전

이번에는 특정 파일을 찾아보자. /usr/sbin/apache2를 찾는 예이다.

# lsof /usr/sbin/apache2
COMMAND   PID     USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
apache2  9651     root txt    REG  253,1   474776 921962 /usr/sbin/../lib/apache2/mpm-worker/apache2
apache2 14428 www-data txt    REG  253,1   474776 921962 /usr/sbin/../lib/apache2/mpm-worker/apache2
apache2 14429 www-data txt    REG  253,1   474776 921962 /usr/sbin/../lib/apache2/mpm-worker/apache2
apache2 14430 www-data txt    REG  253,1   474776 921962 /usr/sbin/../lib/apache2/mpm-worker/apache2

 이번에는 특정 디렉토리 하위 파일을 찾는 것이다.

# lsof +D /usr/sbin
COMMAND    PID   USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
rsyslogd   414 syslog txt    REG  253,1   384440 654108 /usr/sbin/rsyslogd
sshd       612   root txt    REG  253,1   517112 659298 /usr/sbin/sshd
vsftpd     634   root txt    REG  253,1   159880 653691 /usr/sbin/vsftpd
acpid      836   root txt    REG  253,1    43792 666185 /usr/sbin/acpid
atd        837 daemon txt    REG  253,1    23152 665363 /usr/sbin/atd
cron       838   root txt    REG  253,1    44320 657705 /usr/sbin/cron
ntpd      1148    ntp txt    REG  253,1   671176 658483 /usr/sbin/ntpd
sshd     16409   root txt    REG  253,1   517112 659298 /usr/sbin/sshd
sshd     17254   root txt    REG  253,1   517112 659298 /usr/sbin/sshd
sshd     17255   sshd txt    REG  253,1   517112 659298 /usr/sbin/sshd

이번에는 특정 프로세스 명이다.

# lsof -c apache2
COMMAND   PID     USER   FD   TYPE             DEVICE SIZE/OFF     NODE NAME
apache2  9651     root  cwd    DIR              253,1     4096        2 /
apache2  9651     root  rtd    DIR              253,1     4096        2 /
apache2  9651     root  txt    REG              253,1   474776   921962 /usr/lib/apache2/mpm-worker/apache2
apache2  9651     root  mem    REG              253,1   105288   391710 /lib/x86_64-linux-gnu/libresolv-2.15.so
apache2  9651     root  mem    REG              253,1    31104   391718 /lib/x86_64-linux-gnu/libnss_dns-2.15.so
apache2  9651     root  mem    REG              253,1    52120   391721 /lib/x86_64-linux-gnu/libnss_files-2.15.so
apache2  9651     root  mem    REG              253,1    47680   391720 /lib/x86_64-linux-gnu/libnss_nis-2.15.so
apache2  9651     root  mem    REG              253,1    97248   391707 /lib/x86_64-linux-gnu/libnsl-2.15.so
apache2  9651     root  mem    REG              253,1    35680   391722 /lib/x86_64-linux-gnu/libnss_compat-2.15.so

이 옵션은 아래와 같이 중복 사용이 가능하다.

# lsof -c apache2 -c ssh
(생략)
sshd      612     root  mem    REG              253,1   149280   391714 /lib/x86_64-linux-gnu/ld-2.15.so
sshd      612     root    0u   CHR                1,3      0t0     4856 /dev/null
sshd      612     root    1u   CHR                1,3      0t0     4856 /dev/null
sshd      612     root    2u   CHR                1,3      0t0     4856 /dev/null
sshd      612     root    3u  IPv6               7783      0t0      TCP *:ssh (LISTEN)
sshd      612     root    4u  IPv4               7788      0t0      TCP *:ssh (LISTEN)
sshd      612     root    6r  FIFO                0,8      0t0 98449668 pipe
apache2  9651     root  cwd    DIR              253,1     4096        2 /
apache2  9651     root  rtd    DIR              253,1     4096        2 /
apache2  9651     root  txt    REG              253,1   474776   921962 /usr/lib/apache2/mpm-worker/apache2
apache2  9651     root  mem    REG              253,1   105288   391710 /lib/x86_64-linux-gnu/libresolv-2.15.so
apache2  9651     root  mem    REG              253,1    31104   391718 /lib/x86_64-linux-gnu/libnss_dns-2.15.so
apache2  9651     root  mem    REG              253,1    52120   391721 /lib/x86_64-linux-gnu/libnss_files-2.15.so
apache2  9651     root  mem    REG              253,1    47680   391720 /lib/x86_64-linux-gnu/libnss_nis-2.15.so
apache2  9651     root  mem    REG              253,1    97248   391707 /lib/x86_64-linux-gnu/libnsl-2.15.so
(생략)

특정 유저로도 검색할 수 있다.

# lsof -u www-data
COMMAND   PID     USER   FD   TYPE             DEVICE SIZE/OFF     NODE NAME
apache2 14428 www-data  cwd    DIR              253,1     4096        2 /
apache2 14428 www-data  rtd    DIR              253,1     4096        2 /
apache2 14428 www-data  txt    REG              253,1   474776   921962 /usr/lib/apache2/mpm-worker/apache2
apache2 14428 www-data  mem    REG              253,1   105288   391710 /lib/x86_64-linux-gnu/libresolv-2.15.so
apache2 14428 www-data  mem    REG              253,1    31104   391718 /lib/x86_64-linux-gnu/libnss_dns-2.15.so
apache2 14428 www-data  mem    REG              253,1    52120   391721 /lib/x86_64-linux-gnu/libnss_files-2.15.so
apache2 14428 www-data  mem    REG              253,1    47680   391720 /lib/x86_64-linux-gnu/libnss_nis-2.15.so
apache2 14428 www-data  mem    REG              253,1    97248   391707 /lib/x86_64-linux-gnu/libnsl-2.15.so
apache2 14428 www-data  mem    REG              253,1    35680   391722 /lib/x86_64-linux-gnu/libnss_compat-2.15.so
apache2 14428 www-data  mem    REG              253,1    22528   921141 /usr/lib/apache2/modules/mod_status.so
apache2 14428 www-data  mem    REG              253,1    14336   921077 /usr/lib/apache2/modules/mod_setenvif.so
apache2 14428 www-data  mem    REG              253,1    14344   921122 /usr/lib/apache2/modules/mod_reqtimeout.so
apache2 14428 www-data  mem    REG              253,1    34824   921123 /usr/lib/apache2/modules/mod_negotiation.so
apache2 14428 www-data  mem    REG              253,1    18432   921940 /usr/lib/apache2/modules/mod_mime.so
apache2 14428 www-data  mem    REG              253,1    10240   921140 /usr/lib/apache2/modules/mod_env.so
apache2 14428 www-data  mem    REG              253,1    10240   921121 /usr/lib/apache2/modules/mod_dir.so

참고로 lsof -u ^www-data로 하면 www-data 유저만 제외하고 결과를 보여준다. (exclude)

이번에는 PID로 검색해 보자.

# lsof -p 9651
COMMAND  PID USER   FD   TYPE   DEVICE SIZE/OFF     NODE NAME
apache2 9651 root  cwd    DIR    253,1     4096        2 /
apache2 9651 root  rtd    DIR    253,1     4096        2 /
apache2 9651 root  txt    REG    253,1   474776   921962 /usr/lib/apache2/mpm-worker/apache2
apache2 9651 root  mem    REG    253,1   105288   391710 /lib/x86_64-linux-gnu/libresolv-2.15.so
apache2 9651 root  mem    REG    253,1    31104   391718 /lib/x86_64-linux-gnu/libnss_dns-2.15.so
apache2 9651 root  mem    REG    253,1    52120   391721 /lib/x86_64-linux-gnu/libnss_files-2.15.so
apache2 9651 root  mem    REG    253,1    47680   391720 /lib/x86_64-linux-gnu/libnss_nis-2.15.so
apache2 9651 root  mem    REG    253,1    97248   391707 /lib/x86_64-linux-gnu/libnsl-2.15.so
apache2 9651 root  mem    REG    253,1    35680   391722 /lib/x86_64-linux-gnu/libnss_compat-2.15.so
apache2 9651 root  mem    REG    253,1    22528   921141 /usr/lib/apache2/modules/mod_status.so
apache2 9651 root  mem    REG    253,1    14336   921077 /usr/lib/apache2/modules/mod_setenvif.so
apache2 9651 root  mem    REG    253,1    14344   921122 /usr/lib/apache2/modules/mod_reqtimeout.so
apache2 9651 root  mem    REG    253,1    34824   921123 /usr/lib/apache2/modules/mod_negotiation.so
apache2 9651 root  mem    REG    253,1    18432   921940 /usr/lib/apache2/modules/mod_mime.so
apache2 9651 root  mem    REG    253,1    10240   921140 /usr/lib/apache2/modules/mod_env.so
apache2 9651 root  mem    REG    253,1    10240   921121 /usr/lib/apache2/modules/mod_dir.so
apache2 9651 root  mem    REG    253,1    92720   391908 /lib/x86_64-linux-gnu/libz.so.1.2.3.4

마지막으로 특정 포트를 열고 있는 프로세스이다.

# lsof -i :80
COMMAND   PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
apache2  9651     root    3u  IPv4 55344500      0t0  TCP *:http (LISTEN)
apache2 14429 www-data    3u  IPv4 55344500      0t0  TCP *:http (LISTEN)
apache2 14430 www-data    3u  IPv4 55344500      0t0  TCP *:http (LISTEN)