介紹如何在 Linux 系統中使用 netstat
、lsof
或 fuser
指令,查詢占用指定通訊埠的程式。
netstat
指令
netstat
指令屬於 net-tools
套件的一部分,大部分 Linux 發行版都可以透過本身的套件管理系統安裝:
# 安裝 net-tools 套件(Ubuntu/Debian) sudo apt-get install net-tools # 安裝 net-tools 套件(RHEL/CentOS/Fedora) sudo dnf install net-tools
以下是使用 netstat
搭配 grep
指令查詢目前 傾聽 80
連接埠程式的指令:
# 查詢傾聽 80 連接埠的程式 sudo netstat -ntpl | grep -w ':80'
tcp6 0 0 :::80 :::* LISTEN 1231/nginx: master
這裡 netstat
所使用的參數與意義如下:
-n
:以 IP 數字顯示位址。-t
:只顯示 TCP 連線。-p
:顯示行程名稱與 ID,需要root
管理者權限才能看到所有資訊。-l
:只顯示傾聽的 sockets。
lsof
指令
lsof
指令可以透過 lsof
套件安裝:
# 安裝 lsof 套件(Ubuntu/Debian) sudo apt-get install lsof # 安裝 lsof 套件(RHEL/CentOS/Fedora) sudo dnf install lsof
lsof
的 -i
參數可以指定連接埠,查詢傾聽指定連接埠的程式:
# 查詢傾聽 80 連接埠的程式 sudo lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 1231 root 6u IPv4 26556 0t0 TCP *:http (LISTEN) nginx 1231 root 7u IPv6 26557 0t0 TCP *:http (LISTEN) nginx 1243 www-data 6u IPv4 26556 0t0 TCP *:http (LISTEN) nginx 1243 www-data 7u IPv6 26557 0t0 TCP *:http (LISTEN) nginx 1244 www-data 6u IPv4 26556 0t0 TCP *:http (LISTEN) nginx 1244 www-data 7u IPv6 26557 0t0 TCP *:http (LISTEN)
也可以限定通訊協定,例如只列出 TCP 協定傾聽 80
連接埠的程式:
# 查詢 TCP 協定傾聽 80 連接埠的程式 sudo lsof -i TCP:80
fuser
指令
fuser
指令屬於 psmisc
套件的一部分,大部分 Linux 發行版都可以透過本身的套件管理系統安裝:
# 安裝 psmisc 套件(Ubuntu/Debian) sudo apt-get install psmisc # 安裝 psmisc 套件(RHEL/CentOS/Fedora) sudo dnf install psmisc
fuser
可以用來查詢指定協定與通訊埠的程式,例如查詢 TCP 協定傾聽 80 連接埠的程式:
# 查詢 TCP 協定傾聽 80 連接埠的程式 PID sudo fuser 80/tcp
80/tcp: 1231 1243 1244
接著透過 ps
指令查詢 PID 對應的程式名稱:
# 查詢指定 PID 的程式名稱 ps -p 1231 -o comm=
nginx