lsof命令簡介

Pyerlife發表於2018-06-21

lsof 簡介

lsof(list open files)是一個列出當前系統開啟檔案的工具。在linux環境中一切皆檔案,通過檔案不僅僅可以訪問常規資料,還可以訪問網路連線和硬體。所以如傳輸控制協議 (TCP) 和使用者資料包協議 (UDP) 套接字等,系統在後臺都為該應用程式分配了一個檔案描述符,無論這個檔案的本質如何,該檔案描述符為應用程式與基礎作業系統之間的互動提供了通用介面。因為應用程式開啟檔案的描述符列表提供了大量關於這個應用程式本身的資訊,因此通過lsof工具能夠檢視這個列表對系統監測以及排錯將是很有幫助的。

lsof 命令解析

COMMAND    PID  TID    USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd      1         root  cwd       DIR              253,0       224         64 /
systemd      1         root  rtd       DIR              253,0       224         64 /
systemd      1         root  txt       REG              253,0   1482128   67418805 /usr/lib/systemd/systemd
systemd      1         root  mem       REG              253,0     20040   33619254 /usr/lib64/libuuid.so.1.3.0
...

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

  • COMMAND: 程式的名稱
  • PID: 程式識別符號
  • USER: 程式所有者
  • FD: 檔案描述符,應用程式通過檔案描述符識別該檔案。每個程式都有自己的檔案描述符表,因此FD可能會重名
  • TYPE: 檔案型別
  • DEVICE: 指定磁碟的名稱
  • SIZE: 檔案的大小
  • NODE: 索引節點(檔案在磁碟上的標識)
  • NAME: 開啟檔案的確切名稱

檢視程式開啟檔案

  • 列出佔用檔案的程式
$ sudo lsof /home/mysql/
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash    18522 mysql  cwd    DIR  253,0     4096 655378 /home/mysql
sudo    18544  root  cwd    DIR  253,0     4096 655378 /home/mysql
lsof    18545  root  cwd    DIR  253,0     4096 655378 /home/mysql
lsof    18546  root  cwd    DIR  253,0     4096 655378 /home/mysql

可配合 +d 選項,表示/home/mysql目錄及目錄下的檔案,不包括子目錄

$ sudo lsof /home/mysql/ +d
  • 列出pid開啟的檔案

-p選項,列出指定pid開啟的檔案,如果要多個,則用逗號隔開

$ sudo lsof -p 16273
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
nano    16273 root  cwd    DIR  253,0     4096 1179649 /root
  • 列出指定使用者開啟的檔案

-u選項,列出指定使用者開啟的檔案

$ sudo lsof -u test1
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
bash    16335 test1  cwd    DIR  253,0     4096 1966556 /home/test1
  • 列出指定程式名開啟的檔案

-c 選項,列出指定程式名開啟的檔案

sudo lsof -c java   # 顯示command列中以java的所有開啟的檔案

sudo lsof -c java -c sh  # 顯示command列中以java開頭或以sh開頭的開啟的檔案

sudo lsof -c ^java   # 顯示command列中所有不以java開頭的開啟的檔案

檢視網路連線情況

-i 選項,可以列出網路連線情況。語法格式如下:

lsof -i[46] [protocol] [@hostname|hostaddr] [:service|prot]

引數解析:
4/6:IPv4或IPv6
protocol:TCP或UDP
hostname:主機名
hostaddr:ip地址
service:/etc/service中服務名,可寫多個
port:埠號,可寫多個

示例:

1. 檢視IPv4網路情況

$ lsof -i 4
COMMAND     PID      USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rpcbind    1599       rpc    6u  IPv4  10168      0t0  UDP *:sunrpc 
rpcbind    1599       rpc    7u  IPv4  10169      0t0  UDP *:926 
...

2. 檢視指定IP

-n 表示不進行IP域名反查,直接顯示ip地址

$ lsof -i @10.0.137.144 -n
COMMAND   PID      USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
sshd    16734      root    3u  IPv4 14692046      0t0  TCP 10.0.137.144:ssh->10.0.2.136:49614 (ESTABLISHED)
sshd    16736      test    3u  IPv4 14692046      0t0  TCP 10.0.137.144:ssh->10.0.2.136:49614 (ESTABLISHED)

3. 檢視指定IP及埠

$ sudo lsof -i @10.0.137.144:22 -n
COMMAND   PID      USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
sshd    16734      root    3u  IPv4 14692046      0t0  TCP 10.0.137.144:ssh->10.0.2.136:49614 (ESTABLISHED)
sshd    16736      test    3u  IPv4 14692046      0t0  TCP 10.0.137.144:ssh->10.0.2.136:49614 (ESTABLISHED)

4. 檢視指定埠

$ lsof -i :22 -n
COMMAND   PID      USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
sshd     1095      root    3u  IPv4    14032      0t0  TCP *:ssh (LISTEN)
sshd     1095      root    4u  IPv6    14034      0t0  TCP *:ssh (LISTEN)
sshd    16734      root    3u  IPv4 14692046      0t0  TCP 10.0.137.144:ssh->10.0.2.136:49614 (ESTABLISHED)
sshd    16736      test    3u  IPv4 14692046      0t0  TCP 10.0.137.144:ssh->10.0.2.136:49614 (ESTABLISHED)

5. 檢視指定協議

$ sudo lsof -i UDP
COMMAND    PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
rsyslogd 17935 root    3u  IPv4 11066422      0t0  UDP *:40296