list open file의 약자로 시스템에 열린 파일 목록을 알려주고
을 상세한 정보를 출력하는 명령입니다.
리눅스와 유닉스는 추상화된 파일 시스템 ( VFS: Virtual File System)을 사용하므로 일반 파일, 디렉토리, 네트워크 소켓, 라이브러리, 심볼릭 링크 등도 모두 파일로 처리되므로 lsof
에서 상세한 벙보를 확인할 수 있습니다.
유닉스마다 lsof
와 비슷한 용도의 명령어가 있지만 명령어와 옵션이 제각각이고 출력 정보가 상이해 운영체제가 바뀌면 사용하기가 힘듭니다.
lsof
는 리눅스, AIX, 솔라리스, FreeBSD, 맥 OS X 등 종류에 상관없이 옵션과 출력 형식이 일정하다는 장점이 있습니다.
모든 열린 파일 출력
lsof
를 옵션 없이 실행하면 모든 열린 파일의 정보가 출력됩니다.
$ lsof
COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE NODE NAME
init 1 root cwd DIR 0,2 512 2533274790884789 /
init 1 root rtd DIR 0,2 512 2533274790884789 /
init 1 root txt REG 0,2 636192 3377699721016769 /init
init 1 root mem REG 0,0 488897 /init (path dev=0,2, inode=3377699721016769)
init 1 root NOFD /proc/1/fd (opendir: Permission denied)
init 1 9 init root cwd DIR 0,2 512 2533274790884789 /
init 1 9 init root rtd DIR 0,2 512 2533274790884789 /
init 1 9 init root txt REG 0,2 636192 3377699721016769 /init
init 1 9 init root mem REG 0,0 488897 /init (path dev=0,2, inode=3377699721016769)
init 1 9 init root NOFD /proc/1/task/9/fd (opendir: Permission denied)
init 10 root cwd DIR 0,2 512 2533274790884789 /
init 10 root rtd DIR 0,2 512 2533274790884789 /
init 10 root txt REG 0,2 636192 3377699721016769 /init
init 10 root mem REG 0,0 488897 /init (path dev=0,2, inode=3377699721016769)
init 10 root NOFD /proc/10/fd (opendir: Permission denied)
bash 11 miewone cwd DIR 0,2 512 3659174697733897 /home/miewone
bash 11 miewone rtd DIR 0,2 512 2533274790884789 /
bash 11 miewone txt REG 0,2 1183448 1970324837472264 /usr/bin/bash
COMMAND, USER, TYPE, NAME을 보면 어떤 명령어와 사용자가 어떤 경로의 파일을 열었는지 확인할 수 있습니다.
-u
옵션을 이용하면 특정 사용자가 연 파일만 출력할 수 있습니다.
$ lsof -u root
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
init 1 root cwd DIR 0,2 512 2533274790884789 /
init 1 root rtd DIR 0,2 512 2533274790884789 /
init 1 root txt REG 0,2 636192 3377699721016769 /init
init 1 root mem REG 0,0 488897 /init (path dev=0,2, inode=3377699721016769)
init 1 root NOFD /proc/1/fd (opendir: Permission denied)
init 10 root cwd DIR 0,2 512 2533274790884789 /
init 10 root rtd DIR 0,2 512 2533274790884789 /
init 10 root txt REG 0,2 636192 3377699721016769 /init
init 10 root mem REG 0,0 488897 /init (path dev=0,2, inode=3377699721016769)
init 10 root NOFD /proc/10/fd (opendir: Permission denied)
서버가 제대로 구동되지 않았을 때의 주요 원인 중 하나는 해당 포트를 사용하는 프로세스가 이미 있는 경우입니다. 또 정상적으로 구동됐는지 확인하는 방법으로 서버가 사용하는 포트가 열렸는지 확인하는 것이 있습니다.
lsof
의 -i
옵션 뒤에 프로토콜과 포트를 명시하면 해당 프로토콜의 포트를 사용하는 프로세스 정보를 확인할 수 있습니다.
포트를 명시하지 않으면 해당 프로토콜로 열린 모든 포트를 출력합니다.
lsof -i TCP
-p
옵션뒤에 PID를 지정하면 PID 에 해당하는 프로스세가 연 파일만 표시합니다.
$ lsof -p 1
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
init 1 root cwd DIR 0,2 512 2533274790884789 /
init 1 root rtd DIR 0,2 512 2533274790884789 /
init 1 root txt REG 0,2 636192 3377699721016769 /init
init 1 root mem REG 0,0 488897 /init (path dev=0,2, inode=3377699721016769)
init 1 root 3w CHR 1,11 6473924464878474 /dev/kmsg
init 1 root 0u CHR 1,3 18858823440147515 /dev/null
init 1 root 1u CHR 1,3 18858823440147515 /dev/null
init 1 root 2u CHR 1,3 18858823440147515 /dev/null
init 1 root 4u CHR 10,50 5629499534746707 /dev/lxss
init 1 root 5u unknown /unknown (stat: Operation not permitted)
init 1 root 8u DIR 0,2 512 2533274790884789 /
init 1 root 9u sock 0,0 8 can't identify protocol
init 1 root 10u unknown anon_inode (stat: Operation not permitted)
init 1 root 6u unknown anon_inode (stat: Operation not permitted)
아파치 httpd 같은 경우 fork를 통해 여러 개의 프로세스가 생성되므로 여러 번의 -p
옵션을 입력해야 합니다.
이때 -c
옵션과 함께 httpd를 지정하면 httpd 명령어가 연 모든 파일의 정보를 출력합니다.
$lsof -c apache2
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
apache2 1285 root cwd DIR 0,2 512 2533274790884789 /
apache2 1285 root rtd DIR 0,2 512 2533274790884789 /
apache2 1285 root txt REG 0,2 708648 562949954857180 /usr/sbin/apache2
apache2 1285 root mem REG 0,0 533586 /dev/zero (path dev=0,3, inode=5066549581325394)
apache2 1285 root mem REG 0,0 722066 /usr/lib/x86_64-linux-gnu/libnss_files-2.31.so (path dev=0,2, inode=1407374884275346)
apache2 1285 root mem REG 0,0 1435860 /usr/lib/apache2/modules/mod_status.so (path dev=0,2, inode=844424931567828)
apache2 1285 root mem REG 0,0 1435360 /usr/lib/apache2/modules/mod_setenvif.so (path dev=0,2, inode=844424931567328)
apache2 1285 root mem REG 0,0 1435352 /usr/lib/apache2/modules/mod_reqtimeout.so (path dev=0,2, inode=844424931567320)
apache2 1285 root mem REG 0,0 1434598 /usr/lib/apache2/modules/mod_negotiation.so (path dev=0,2, inode=844424931566566)
apache2 1285 root mem REG 0,0 1434578 /usr/lib/apache2/modules/mod_mpm_event.so (path dev=0,2, inode=1125899908277202)
apache2 1285 root mem REG 0,0 1434573 /usr/lib/apache2/modules/mod_mime.so (path dev=0,2, inode=1688849861698509)
apache2 1285 root mem REG 0,0 1434426 /usr/lib/apache2/modules/mod_filter.so (path dev=0,2, inode=1407374884987706)
apache2 1285 root mem REG 0,0 1052987 /usr/lib/apache2/modules/mod_env.so (path dev=0,2, inode=3096224744870203)
apache2 1285 root mem REG 0,0 1052699 /usr/lib/apache2/modules/mod_dir.so (path dev=0,2, inode=2533274791448603)
apache2 1285 root mem REG 0,0 722391 /usr/lib/x86_64-linux-gnu/libz.so.1.2.11 (path dev=0,2, inode=1407374884275671)
apache2 1285 root mem REG 0,0 1051835 /usr/lib/apache2/modules/mod_deflate.so (path dev=0,2, inode=3096224744869051)
apache2 1285 root mem REG 0,0 1036363 /usr/lib/apache2/modules/mod_autoindex.so (path dev=0,2, inode=844424931168331)
apache2 1285 root mem REG 0,0 1032590 /usr/lib/apache2/modules/mod_authz_user.so (path dev=0,2, inode=4222124651692430)
apache2 1285 root mem REG 0,0 1032552 /usr/lib/apache2/modules/mod_authz_host.so (path dev=0,2, inode=3096224744849768)
apache2 1285 root mem REG 0,0 1032293 /usr/lib/apache2/modules/mod_authz_core.so (path dev=0,2, inode=1970324838006885)
apache2 1285 root mem REG 0,0 1022772 /usr/lib/apache2/modules/mod_authn_file.so (path dev=0,2, inode=5066549581814580)
apache2 1285 root mem REG 0,0 1022658 /usr/lib/apache2/modules/mod_authn_core.so (path dev=0,2, inode=3659174698261186)
apache2 1285 root mem REG 0,0 919397 /usr/lib/apache2/modules/mod_auth_basic.so (path dev=0,2, inode=7881299348817765)
lsof
는 프로세스를 보는 명령어인 ps
나 네트워크의 연결 상태나 포트를 보는 명령어인 netstat
보다 자세한 정보를 제공하며, 다른 유닉스에도 이식돼 있으므로 운영체제가 바뀌어도 편리하게 사용할 수 있습니다
특히 특정 프로세스가 사용되는 파일을 찾거나 특정 포트를 점유한 프로세스를 찾는 등 문제가 발생했을 때 원인을 분석하는데 쓸모가 많습니다