[Linux] lsof

박원균·2021년 11월 12일
0

Linux

목록 보기
5/5
post-thumbnail

lsof 란?

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 : 실행한 명령어
  • PID : 프로세스 아이디
  • USER : 실행한 사용자
  • FD : 파일기술자 (File Descriptor)
    • cwd: 현재 작업 디렉터리
    • rtd: 루트 디렉터리
    • mem: 메모리에 매핑된 파일(emmory-mapped file)
    • txt: 프로그랩 텍스트(코드와 데이터)
  • TYPE: 파일 종류로 매우 다양한 파일이 있지만 대표적인 것은 아래와 같습니다.
    • DIR: 디렉토리
    • CHR: 시리얼 포트 등의 문자 특수 파일(character special file)
    • REG: 디스크에 존재하는 텍스트나 실행 파일, 라이브러리 등이 일반 파일
    • unix: 유닉스 도메인 소켓
  • DEVICE: 장치번호
  • SZIE/OFF: 파일의 크기나 오프셋
  • NODE: 노드번호
  • NAME: 파일명

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

특정 ID의 프로세스가 연 파일 보기

-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보다 자세한 정보를 제공하며, 다른 유닉스에도 이식돼 있으므로 운영체제가 바뀌어도 편리하게 사용할 수 있습니다

특히 특정 프로세스가 사용되는 파일을 찾거나 특정 포트를 점유한 프로세스를 찾는 등 문제가 발생했을 때 원인을 분석하는데 쓸모가 많습니다

profile
함바라기

0개의 댓글

관련 채용 정보