Linux查看端口占用Address already in use


what's the 監聽端口

  當程序的端口被占用時,會出現 Address already in use 的報錯信息。在對網絡連接或特定於應用程序的問題進行故障排除時,首先要檢查的事情之一應該是系統上實際使用了哪些端口,以及哪個應用程序正在偵聽特定的端口。

  在 Linux 中可以使用 netstat,ss 和 lsof 命令找出哪些服務正在偵聽哪些端口。

  網絡端口由其編號,關聯的 IP 地址和通信協議(例如 TCP 或 UDP)的類型標識。 偵聽端口是應用程序或進程在其上偵聽的網絡端口,充當通信端點。 每個監聽端口都可以使用防火牆打開或關閉(過濾)。

  一般而言,開放端口是一個網絡端口,它接受來自遠程位置的傳入數據包。 不能讓兩個服務監聽同一 IP 地址上的同一端口。 例如,如果正在運行一個監聽端口 80 和 443 的 Apache Web 服務器,並且嘗試安裝 Nginx ,則后者將無法啟動,因為 HTTP 和 HTTPS 端口已經在使用中。

 

netstat 命令

  netstat 可以提供有關網絡連接的信息。 

# 列出所有正在偵聽的TCP或UDP端口,包括使用端口的服務和套接字狀態
sudo netstat -tunlp  

'''
參數的含義
-t-顯示TCP端口。
-u -顯示UDP端口。
-n -顯示數字地址而不是解析主機。
-l -僅顯示監聽端口。
-p -顯示偵聽器進程的PID和名稱。僅當你以root用戶或 sudo 用戶身份運行命令時,才會顯示此信息。
'''
# 輸出的形式
Proto Recv-Q Send-Q Local Address   Foreign Address     State       PID/Program name      
tcp        0      0 0:22              0:*               LISTEN      445/sshd              
tcp        0      0 0:25              0:*               LISTEN      929/master            
tcp6       0      0 :::3306           ::*               LISTEN      534/mysqld            
tcp6       0      0 :::80             :::*              LISTEN      515/apache2           
tcp6       0      0 :::22             :::*              LISTEN      445/sshd              
tcp6       0      0 :::25             :::*              LISTEN      929/master            
tcp6       0      0 :::33060          :::*              LISTEN      534/mysqld            
udp        0      0 0:68              0:*                           966/dhclient  

'''
參數解析
Proto——套接字使用的協議。
Local Address——進程偵聽的IP地址和端口號。
PID/Program name——PID和進程名稱。
'''
輸出示例
# 用grep過濾,指定端口
sudo netstat -tnlp | grep :22  

 

  如果輸出為空,則表示端口上沒有監聽。

  netstat 目前已過時,被 ss和 ip 取代,但它仍然是檢查網絡連接的最常用命令。

 

ss 命令

  ss 是新的 netstat。它缺少 netstat 的某些功能,但是公開了更多的 TCP 狀態,並且速度稍快。命令選項基本相同,輸出與 netstat 報告的輸出幾乎相同,因此從 netstat 到 ss 的轉換並不困難。

sudo ss -tunlp

 

lsof 命令

  lsof 是功能強大的命令行應用程序,可提供有關進程打開的文件的信息。在 Linux 中,所有內容都是文件。可以將套接字視為寫入網絡的文件。

sudo lsof -nP -iTCP -sTCP:LISTEN  

'''
參數解析
-n——不要將端口號轉換為端口名稱。
-p——不解析主機名,顯示數字地址。
-iTCP和sTCP:LISTEN——僅顯示TCP狀態為LISTEN的網絡文件。
'''
# 輸出形式
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME  
sshd      445     root    3u  IPv4  16434      0t0  TCP *:22 (LISTEN)  
sshd      445     root    4u  IPv6  16445      0t0  TCP *:22 (LISTEN)  
apache2   515     root    4u  IPv6  16590      0t0  TCP *:80 (LISTEN)  
mysqld    534    mysql   30u  IPv6  17636      0t0  TCP *:3306 (LISTEN)  
mysqld    534    mysql   33u  IPv6  19973      0t0  TCP *:33060 (LISTEN)  
apache2   764 www-data    4u  IPv6  16590      0t0  TCP *:80 (LISTEN)  
apache2   765 www-data    4u  IPv6  16590      0t0  TCP *:80 (LISTEN)  
master    929     root   13u  IPv4  19637      0t0  TCP *:25 (LISTEN)  
master    929     root   14u  IPv6  19638      0t0  TCP *:25 (LISTEN) 

'''
參數解析
COMMAND,PID,USER——運行與端口關聯的程序的名稱,PID和用戶。
NAME——端口號。
''' 
輸出示例
# 查找正在偵聽特定端口3306
sudo lsof -nP -iTCP:3306 -sTCP:LISTEN  

 

 

 

 

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM