lsof
(list open files)是一個列出當前系統打開文件的工具。在linux環境中一切皆文件,經過文件不單單能夠訪問常規數據,還能夠訪問網絡鏈接和硬件。因此如傳輸控制協議 (TCP) 和用戶數據報協議 (UDP) 套接字等,系統在後臺都爲該應用程序分配了一個文件描述符,不管這個文件的本質如何,該文件描述符爲應用程序與基礎操做系統之間的交互提供了通用接口。由於應用程序打開文件的描述符列表提供了大量關於這個應用程序自己的信息,所以經過lsof工具可以查看這個列表對系統監測以及排錯將是頗有幫助的。java
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
輸出各列信息的意義以下:mysql
$ 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
目錄及目錄下的文件,不包括子目錄linux
$ sudo lsof /home/mysql/ +d
-p
選項,列出指定pid打開的文件,若是要多個,則用逗號隔開sql
$ 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
選項,列出指定用戶打開的文件bash
$ 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
選項,能夠列出網絡鏈接狀況。語法格式以下:ssh
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. 查看指定IPui
-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