Linux 下查看端口是否被佔用

以前在配置項目環境時,經常需要確認某個端口是否開啓或被佔用,但是對應的命令總是忘,每次都要百度比較麻煩,所以記一下加深印象。

查看端口是否被佔用的兩種方式

當然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域套接口(和網絡套接字一樣,但是隻能用於本機通信,性能可以提高一倍)。

發佈了23 篇原創文章 · 獲贊 27 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章