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
