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