ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리눅스 lsof 란?
    리눅스 2017. 1. 5. 09:40

     

    lsof

    - 유닉스나 리눅스에서 대상 프로세스의 프로세스 ID[PID]를 알고 있어야 하고, root 계정 또는 모니터링 대상 프로세스를 가동한 정보를 조회할 수 있다.

     

    - 파일지시자가 제공해주는 키값을 사용하고 있는 목록을 제공해줌

     

     

    모든 열린 파일 출력 

    옵션 없이 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 보다 속도가 매우 빠름)
    6. DEVICE : 장치 번호
    7. SIZE/OFF: 파일의 크기나 오프셋
    8. NODE: 노드 번호
    9. 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`

     

     

    출처 : https://www.lesstif.com/pages/viewpage.action?pageId=20776078

Designed by Tistory.