以前在配置項目環境時,經常需要確認某個端口是否開啓或被佔用,但是對應的命令總是忘,每次都要百度比較麻煩,所以記一下加深印象。
查看端口是否被佔用的兩種方式
當然linux 查看端口是否被佔用的方式不止兩種,這裏說一下最常用的兩種
一、lsof -i:端口
$ lsof -i:6379
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 9426 wentong 6u IPv6 0xe92237cea15f9491 0t0 TCP *:6379 (LISTEN)
redis-ser 9426 wentong 7u IPv4 0xe92237ce94e02489 0t0 TCP *:6379 (LISTEN)
lsof(list open files)是一個列出當前系統打開文件的工具。在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件。
在終端下輸入lsof即可顯示系統打開的文件,因爲 lsof 需要訪問核心內存和各種文件,所以必須以 root 用戶的身份運行它才能夠充分地發揮其功能。
百度百科講的很清楚了,Linux 下所有事物都以文件的形式存在,losf 可以通過查看網絡連接來判斷端口是否被佔用。
lsof -i 用以顯示符合條件的進程情況
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
我們可以通過協議、@hostname、hostaddr、:service|port 來查看對應的文件。
比如查看tcp
$ lsof -i tcp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rapportd 1074 wentong 4u IPv4 0xe92237ce94e02e51 0t0 TCP *:49574 (LISTEN)
rapportd 1074 wentong 5u IPv6 0xe92237ce94bb6ab1 0t0 TCP *:49574 (LISTEN)
rapportd 1074 wentong 13u IPv4 0xe92237cea20baf39 0t0 TCP 172.20.10.2:49574->172.20.10.1:50836 (ESTABLISHED)
rapportd 1074 wentong 14u IPv4 0xe92237ce9b9db819 0t0 TCP 172.20.10.2:49574->172.20.10.8:53703 (ESTABLISHED)
查看服務
[root@iZwz9hmb50uzud432t180uZ ~]# lsof -i:redis
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 29410 redis 6u IPv4 439649 0t0 TCP *:redis (LISTEN)
其他常用的參數列表:
lsof filename 顯示打開指定文件的所有進程
lsof -a 表示兩個參數都必須滿足時才顯示結果
lsof -c string 顯示COMMAND列中包含指定字符的進程所有打開的文件
lsof -u username 顯示所屬user進程打開的文件
lsof -g gid 顯示歸屬gid的進程情況
lsof +d /DIR/ 顯示目錄下被進程打開的文件
lsof +D /DIR/ 同上,但是會搜索目錄下的所有目錄,時間相對較長
lsof -d FD 顯示指定文件描述符的進程
lsof -n 不將IP轉換爲hostname,缺省是不加上-n參數
在lsof 中各列信息的意思分別爲:
各列展示信息解釋:
COMMAND:進程的名稱
PID:進程標識符
USER:進程所有者
FD:文件描述符,應用程序通過文件描述符識別該文件。如cwd、txt等
TYPE:文件類型,如DIR、REG等
DEVICE:指定磁盤的名稱
SIZE:文件的大小
NODE:索引節點(文件在磁盤上的標識)
NAME:打開文件的確切名稱
二、netstart
[root@iZwz9hmb50uzud432t180uZ ~]# netstat -anp | grep 80
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 18335/java
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 31220/nginx: master
tcp 0 0 192.168.1.51:56792 100.100.30.25:80 ESTABLISHED 1105/AliYunDun
tcp6 0 0 :::80 :::* LISTEN 31220/nginx: master
通過netstat -anp | grep 80 我們可以看出nginx 監聽了80 端口,LISTEN 和LISTENING 要區別開。
常見的連接狀態有:
LISTEN
偵聽來自遠方的TCP端口的連接請求
SYN-SENT
在發送連接請求後等待匹配的連接請求
SYN-RECEIVED
在收到和發送一個連接請求後等待對方對連接請求的確認
ESTABLISHED
代表一個打開的連接
FIN-WAIT-1
等待遠程TCP連接中斷請求,或先前的連接中斷請求的確認
FIN-WAIT-2
從遠程TCP等待連接中斷請求
CLOSE-WAIT
等待從本地用戶發來的連接中斷請求
CLOSING
等待遠程TCP對連接中斷的確認
LAST-ACK
等待原來的發向遠程TCP的連接中斷請求的確認
TIME-WAIT
等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認
CLOSED
沒有任何連接狀態
Netstat是在內核中訪問網絡連接狀態及其相關信息的程序,它能提供TCP連接,TCP和UDP監聽,進程內存管理的相關報告。
Netstat是控制檯命令,是一個監控TCP/IP網絡的非常有用的工具,它可以顯示路由表、實際的網絡連接以及每一個網絡接口設備的狀態信息。Netstat用於顯示與IP、TCP、UDP和ICMP協議相關的統計數據,一般用於檢驗本機各端口的網絡連接情況。
netstat 主要是監聽網絡的工具,它的常用參數:
-a 顯示所有socket,包括正在監聽的。
-n 以網絡IP地址代替名稱,顯示出網絡連接情形。
-p 顯示建立相關連接的程序名和PID。
-c 每隔1秒就重新顯示一遍,直到用戶中斷它。
-i 顯示所有網絡接口的信息,格式“netstat -i”。
-r顯示核心路由表,格式同“route -e”。
-t 顯示TCP協議的連接情況
-u 顯示UDP協議的連接情況。
-v 顯示正在進行的工作。
-b 顯示在創建每個連接或偵聽端口時涉及的可執行程序。
-e 顯示以太網統計。此選項可以與 -s 選項結合使用。
-f 顯示外部地址的完全限定域名(FQDN)。
-o顯示與與網絡計時器相關的信息。
-s 顯示每個協議的統計。
-x 顯示 NetworkDirect 連接、偵聽器和共享端點。
-y 顯示所有連接的 TCP 連接模板。無法與其他選項結合使用。
我們上面用的netstat -anp 就是參數a,n,p 的集合如果單獨使用netstat:
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 iZwz9hmb50uzud432t1:ssh 223.104.250.148:48543 ESTABLISHED
tcp 0 0 iZwz9hmb50uzud432:56792 100.100.30.25:http ESTABLISHED
tcp 0 0 iZwz9hmb50uzud:webcache 85.119.151.254:35415 FIN_WAIT2
tcp 0 0 iZwz9hmb50uzud432t1:ssh 223.104.250.148:55488 ESTABLISHED
tcp 0 36 iZwz9hmb50uzud432t1:ssh 223.104.250.148:40173 ESTABLISHED
tcp 0 0 iZwz9hmb50uzud432t1:ssh 223.104.250.148:40997 ESTABLISHED
tcp 0 0 iZwz9hmb50uzud432t1:ssh 223.104.250.148:37248 ESTABLISHED
tcp 0 0 iZwz9hmb50uzud:webcache 85.119.151.251:37467 FIN_WAIT2
tcp 0 0 iZwz9hmb50uzud432t1:ssh 223.104.250.148:54500 ESTABLISHED
tcp 0 0 iZwz9hmb50uzud432t1:ssh 223.104.250.148:62286 ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 462645 /run/user/0/systemd/notify
unix 4 [ ] DGRAM 10900 /run/systemd/notify
unix 2 [ ] DGRAM 10902 /run/systemd/cgroups-agent
unix 6 [ ] DGRAM 10917 /run/systemd/journal/socket
unix 16 [ ] DGRAM 10935 /run/systemd/journal/dev-log
unix 2 [ ] DGRAM 269257 /var/run/chrony/chronyd.sock
unix 3 [ ] STREAM CONNECTED 448234
unix 2 [ ] DGRAM 22252
unix 2 [ ] STREAM CONNECTED 854514
unix 3 [ ] DGRAM 462647
unix 3 [ ] STREAM CONNECTED 357348
unix 2 [ ] STREAM CONNECTED 857773
unix 3 [ ] STREAM CONNECTED 270110
...
可以看出netstat 展示的信息分爲兩部分:
Active Internet connections,稱爲有源TCP連接,其中"Recv-Q"和"Send-Q"指的是接收隊列和發送隊列,這些數字一般都應該是0。如果不是則表示軟件包正在隊列中堆積,這種情況非常少見。
另一個是Active UNIX domain sockets,稱爲有源Unix域套接口(和網絡套接字一樣,但是隻能用於本機通信,性能可以提高一倍)。