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)