Linux技術——lsof命令詳解

readyao發表於2016-03-03

簡介:

lsof命令是一個列出當前系統開啟檔案的工具。

1、直接輸入命令 lsof

終端下輸入lsof就會顯示系統開啟的所有檔案。由於lsof會訪問核心記憶體和各種檔案,必須以root使用者來執行該命令。
在終端下直接輸入lsof,輸入一下結果,輸出太多內容。我輸入的是lsof | less ,下面擷取了前一部分內容:

COMMAND     PID   TID       USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
init          1             root  cwd       DIR                8,1     4096          2 /
init          1             root  rtd       DIR                8,1     4096          2 /
init          1             root  txt       REG                8,1   265848     786591 /sbin/init
init          1             root  mem       REG                8,1    47712     266561 /lib/x86_64-linux-gnu/libnss_files-2.19.so
init          1             root  mem       REG                8,1    47760     266571 /lib/x86_64-linux-gnu/libnss_nis-2.19.so
init          1             root  mem       REG                8,1    97296     266555 /lib/x86_64-linux-gnu/libnsl-2.19.so
init          1             root  mem       REG                8,1    39824     266557 /lib/x86_64-linux-gnu/libnss_compat-2.19.so
init          1             root  mem       REG                8,1    14664     266503 /lib/x86_64-linux-gnu/libdl-2.19.so
init          1             root  mem       REG                8,1   252032     266589 /lib/x86_64-linux-gnu/libpcre.so.3.13.1
init          1             root  mem       REG                8,1   141574     266606 /lib/x86_64-linux-gnu/libpthread-2.19.so
init          1             root  mem       REG                8,1  1845024     266486 /lib/x86_64-linux-gnu/libc-2.19.so
init          1             root  mem       REG                8,1    31792     266614 /lib/x86_64-linux-gnu/librt-2.19.so
init          1             root  mem       REG                8,1    39328     266526 /lib/x86_64-linux-gnu/libjson-c.so.2.0.0
init          1             root  mem       REG                8,1   134296     266616 /lib/x86_64-linux-gnu/libselinux.so.1
init          1             root  mem       REG                8,1   281552     266500 /lib/x86_64-linux-gnu/libdbus-1.so.3.7.6
init          1             root  mem       REG                8,1    38920     266548 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
init          1             root  mem       REG                8,1    96280     266550 /lib/x86_64-linux-gnu/libnih.so.1.0.0
init          1             root  mem       REG                8,1   149120     266462 /lib/x86_64-linux-gnu/ld-2.19.so
init          1             root    0u      CHR                1,3      0t0       5294 /dev/null
init          1             root    1u      CHR                1,3      0t0       5294 /dev/null
init          1             root    2u      CHR                1,3      0t0       5294 /dev/null
init          1             root    3r     FIFO                0,8      0t0       7021 pipe
init          1             root    4w     FIFO                0,8      0t0       7021 pipe
init          1             root    5r     0000                0,9        0       5249 anon_inode
init          1             root    6r     0000                0,9        0       5249 anon_inode
init          1             root    7u     unix 0xffff880036c4a700      0t0       7022 @/com/ubuntu/upstart
init          1             root    9u     unix 0xffff8800d7115500      0t0       7879 socket
init          1             root   10u     unix 0xffff8800d894ae00      0t0       7357 @/com/ubuntu/upstart
init          1             root   11u     unix 0xffff8800d736dc00      0t0       8042 @/com/ubuntu/upstart
init          1             root   12u     unix 0xffff8800d7115180      0t0       7803 @/com/ubuntu/upstart

2、lsof輸出各列資訊的意義如下:

COMMAND:程式的名稱 
PID:程式識別符號
USER:程式所有者
FD:檔案描述符,應用程式通過檔案描述符識別該檔案。如cwd、txt、數字等 
TYPE:檔案型別,如DIR、REG等
DEVICE:指定磁碟的名稱
SIZE:檔案的大小
NODE:索引節點(檔案在磁碟上的標識)
NAME:開啟檔案的確切名稱

FD列的型別含義:

cwd值表示應用程式的當前工作目錄,這是該應用程式啟動的目錄,除非它本身對這個目錄進行更改。
txt 型別的檔案是程式程式碼,如應用程式二進位制檔案本身或共享庫,如上列表中顯示的 /sbin/init 程式。
數值表示應用程式的檔案描述符,這是開啟該檔案時返回的一個整數。u表示該檔案被開啟並處於讀取/寫入模式,而不是隻讀r或只寫w模式。、

同時還有大寫的W表示該應用程式具有對整個檔案的寫鎖。該檔案描述符用於確保每次只能開啟一個應用程式例項。

初始開啟每個應用程式時,都具有三個檔案描述符,從 0 到 2,分別表示標準輸入、輸出和錯誤流。所以大多數應用程式所開啟的檔案的 FD 都是從 3 開始。

TYPE列的型別含義:

 REG 和 DIR分別表示檔案和目錄;CHR 和 BLK,分別表示字元和塊裝置; UNIX、FIFO 和 IPv4,分別表示 UNIX 域套接字、先進先出 (FIFO) 佇列和網際協議 (IP) 套接字。


3、常用引數:

lsof abc.txt         顯示開啟檔案abc.txt的程式
lsof -c abc         顯示abc程式現在開啟的檔案
lsof -c -p 1234  列出程式號為1234的程式所開啟的檔案
lsof -g gid          顯示歸屬gid的程式情況
lsof +d /usr/local/     顯示目錄下被程式開啟的檔案
lsof +D /usr/local/    同上,但是會搜尋目錄下的目錄,時間較長
lsof -d 4                     顯示使用fd為4的程式
lsof -i                          用以顯示符合條件的程式情況

例子1:檢視開啟檔案/dev/ptmx的程式

root@linux_ever:~# lsof /dev/ptmx
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
init          1 root   17u   CHR    5,2      0t0 6303 /dev/ptmx
init          1 root   20u   CHR    5,2      0t0 6303 /dev/ptmx
init          1 root   22u   CHR    5,2      0t0 6303 /dev/ptmx
init          1 root   23u   CHR    5,2      0t0 6303 /dev/ptmx
init          1 root   25u   CHR    5,2      0t0 6303 /dev/ptmx
init          1 root   26u   CHR    5,2      0t0 6303 /dev/ptmx
init          1 root   33u   CHR    5,2      0t0 6303 /dev/ptmx
init          1 root   34u   CHR    5,2      0t0 6303 /dev/ptmx
init       1842 root   14u   CHR    5,2      0t0 6303 /dev/ptmx
init       1842 root   16u   CHR    5,2      0t0 6303 /dev/ptmx
init       1842 root   21u   CHR    5,2      0t0 6303 /dev/ptmx
init       1842 root   24u   CHR    5,2      0t0 6303 /dev/ptmx
init       1842 root   27u   CHR    5,2      0t0 6303 /dev/ptmx
init       1842 root   28u   CHR    5,2      0t0 6303 /dev/ptmx
init       1842 root   31u   CHR    5,2      0t0 6303 /dev/ptmx
init       1842 root   32u   CHR    5,2      0t0 6303 /dev/ptmx
init       1842 root   33u   CHR    5,2      0t0 6303 /dev/ptmx
init       1842 root   36u   CHR    5,2      0t0 6303 /dev/ptmx
init       1842 root   37u   CHR    5,2      0t0 6303 /dev/ptmx
init       1842 root   38u   CHR    5,2      0t0 6303 /dev/ptmx
init       1842 root   39u   CHR    5,2      0t0 6303 /dev/ptmx
init       1842 root   40u   CHR    5,2      0t0 6303 /dev/ptmx
init       1842 root   41u   CHR    5,2      0t0 6303 /dev/ptmx
init       1842 root   42u   CHR    5,2      0t0 6303 /dev/ptmx
init       1842 root   43u   CHR    5,2      0t0 6303 /dev/ptmx
gnome-ter  2751 root   14u   CHR    5,2      0t0 6303 /dev/ptmx
sshd      20723 root    8u   CHR    5,2      0t0 6303 /dev/ptmx
sshd      20723 root   10u   CHR    5,2      0t0 6303 /dev/ptmx
sshd      20723 root   11u   CHR    5,2      0t0 6303 /dev/ptmx
sshd      21617 root    8u   CHR    5,2      0t0 6303 /dev/ptmx
sshd      21617 root   10u   CHR    5,2      0t0 6303 /dev/ptmx
sshd      21617 root   11u   CHR    5,2      0t0 6303 /dev/ptmx
sshd      21858 root    8u   CHR    5,2      0t0 6303 /dev/ptmx
sshd      21858 root   10u   CHR    5,2      0t0 6303 /dev/ptmx
sshd      21858 root   11u   CHR    5,2      0t0 6303 /dev/ptmx

例子2:檢視sshd程式現在開啟的檔案

root@linux_ever:~# lsof -c sshd
COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF   NODE NAME
sshd      813 root  cwd    DIR                8,1     4096      2 /
sshd      813 root  rtd    DIR                8,1     4096      2 /
sshd      813 root  txt    REG                8,1   766784 409713 /usr/sbin/sshd
sshd      813 root  mem    REG                8,1    47712 266561 /lib/x86_64-linux-gnu/libnss_files-2.19.so
sshd      813 root  mem    REG                8,1    47760 266571 /lib/x86_64-linux-gnu/libnss_nis-2.19.so
sshd      813 root  mem    REG                8,1    39824 266557 /lib/x86_64-linux-gnu/libnss_compat-2.19.so
sshd      813 root  mem    REG                8,1   101240 266612 /lib/x86_64-linux-gnu/libresolv-2.19.so
sshd      813 root  mem    REG                8,1    14256 266529 /lib/x86_64-linux-gnu/libkeyutils.so.1.4
sshd      813 root  mem    REG                8,1    43672 532257 /usr/lib/x86_64-linux-gnu/libkrb5support.so.0.1
sshd      813 root  mem    REG                8,1   186824 532251 /usr/lib/x86_64-linux-gnu/libk5crypto.so.3.1
sshd      813 root  mem    REG                8,1    31792 266614 /lib/x86_64-linux-gnu/librt-2.19.so
sshd      813 root  mem    REG                8,1   141574 266606 /lib/x86_64-linux-gnu/libpthread-2.19.so
sshd      813 root  mem    REG                8,1   252032 266589 /lib/x86_64-linux-gnu/libpcre.so.3.13.1
sshd      813 root  mem    REG                8,1    14664 266503 /lib/x86_64-linux-gnu/libdl-2.19.so
sshd      813 root  mem    REG                8,1   104936 266476 /lib/x86_64-linux-gnu/libaudit.so.1.0.0
sshd      813 root  mem    REG                8,1    97296 266555 /lib/x86_64-linux-gnu/libnsl-2.19.so
sshd      813 root  mem    REG                8,1  1845024 266486 /lib/x86_64-linux-gnu/libc-2.19.so

列出了部分結果。

例子3:程式ID為813的程式開啟的檔案

root@linux_ever:~# lsof -p 813   
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
sshd    813 root  cwd    DIR    8,1     4096      2 /
sshd    813 root  rtd    DIR    8,1     4096      2 /
sshd    813 root  txt    REG    8,1   766784 409713 /usr/sbin/sshd
sshd    813 root  mem    REG    8,1    47712 266561 /lib/x86_64-linux-gnu/libnss_files-2.19.so
sshd    813 root  mem    REG    8,1    47760 266571 /lib/x86_64-linux-gnu/libnss_nis-2.19.so
sshd    813 root  mem    REG    8,1    39824 266557 /lib/x86_64-linux-gnu/libnss_compat-2.19.so
sshd    813 root  mem    REG    8,1   101240 266612 /lib/x86_64-linux-gnu/libresolv-2.19.so
sshd    813 root  mem    REG    8,1    14256 266529 /lib/x86_64-linux-gnu/libkeyutils.so.1.4
sshd    813 root  mem    REG    8,1    43672 532257 /usr/lib/x86_64-linux-gnu/libkrb5support.so.0.1
sshd    813 root  mem    REG    8,1   186824 532251 /usr/lib/x86_64-linux-gnu/libk5crypto.so.3.1
sshd    813 root  mem    REG    8,1    31792 266614 /lib/x86_64-linux-gnu/librt-2.19.so
sshd    813 root  mem    REG    8,1   141574 266606 /lib/x86_64-linux-gnu/libpthread-2.19.so
sshd    813 root  mem    REG    8,1   252032 266589 /lib/x86_64-linux-gnu/libpcre.so.3.13.1
sshd    813 root  mem    REG    8,1    14664 266503 /lib/x86_64-linux-gnu/libdl-2.19.so
sshd    813 root  mem    REG    8,1   104936 266476 /lib/x86_64-linux-gnu/libaudit.so.1.0.0
sshd    813 root  mem    REG    8,1    97296 266555 /lib/x86_64-linux-gnu/libnsl-2.19.so
sshd    813 root  mem    REG    8,1  1845024 266486 /lib/x86_64-linux-gnu/libc-2.19.so
列出了部分結果。

例子4:顯示/root/目錄下被程式開啟的檔案

root@linux_ever:~# lsof +d /root/
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
init       1842 root  cwd    DIR    8,1     4096 1048579 /root
init       1842 root    2w   REG    8,1      546 1050044 /root/.xsession-errors
VBoxClien  1926 root    4uW  REG    8,1        5 1076068 /root/.vboxclient-clipboard.pid
VBoxClien  1937 root    4uW  REG    8,1        5 1076123 /root/.vboxclient-display.pid
VBoxClien  1941 root    4uW  REG    8,1        5 1076124 /root/.vboxclient-seamless.pid
VBoxClien  1949 root    4uW  REG    8,1        5 1076125 /root/.vboxclient-draganddrop.pid
upstart-e  1984 root  cwd    DIR    8,1     4096 1048579 /root
window-st  1993 root  cwd    DIR    8,1     4096 1048579 /root
upstart-f  2003 root  cwd    DIR    8,1     4096 1048579 /root
列出了部分結果。

例子5:顯示/root/目錄下被程式開啟的檔案,並搜尋子目錄

root@linux_ever:~# lsof +D /root/
COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
init       1842   root  cwd    DIR    8,1     4096 1048579 /root
init       1842   root    2w   REG    8,1      546 1050044 /root/.xsession-errors
init       1842   root   12w   REG    8,1     1001 1051098 /root/.cache/upstart/dbus.log
init       1842   root   13w   REG    8,1    27348 1068051 /root/.cache/upstart/gnome-session-Unity.log
init       1842   root   18w   REG    8,1     3597 1077157 /root/.cache/upstart/unity-panel-service.log
init       1842   root   19w   REG    8,1      106 1077132 /root/.cache/upstart/unity-settings-daemon.log
init       1842   root   25w   REG    8,1      125 1076111 /root/.cache/upstart/indicator-printers.log
VBoxClien  1926   root    4uW  REG    8,1        5 1076068 /root/.vboxclient-clipboard.pid
VBoxClien  1937   root    4uW  REG    8,1        5 1076123 /root/.vboxclient-display.pid
VBoxClien  1941   root    4uW  REG    8,1        5 1076124 /root/.vboxclient-seamless.pid
VBoxClien  1949   root    4uW  REG    8,1        5 1076125 /root/.vboxclient-draganddrop.pid
列出了部分結果。

例子6:顯示使用fd為5的所有程式

root@linux_ever:~# lsof -d 5
COMMAND     PID       USER   FD      TYPE             DEVICE SIZE/OFF    NODE NAME
init          1       root    5r     0000                0,9        0    5249 anon_inode
upstart-u   268       root    5w     FIFO                0,8      0t0    7347 pipe
systemd-u   283       root    5u      REG               0,16        8  242959 /run/udev/queue.bin
dbus-daem   408 messagebus    5r     0000                0,9        0    5249 anon_inode
bluetooth   452       root    5u     unix 0xffff8800d72d8000      0t0    8015 socket
systemd-l   491       root    5r      REG               0,15     4096    2813 /sys/devices/virtual/tty/tty0/active
avahi-dae   507      avahi    5u     unix 0xffff8800d736ca80      0t0    8074 socket
ModemMana   558       root    5u     unix 0xffff8800d7200380      0t0    8289 socket
upstart-f   597       root    5w     FIFO                0,8      0t0    7795 pipe
列出了部分結果。

參考文章: