如何查看端口占用,各平臺
一、背景
如何查看端口占用?網(wǎng)上很多,但大多直接丟出命令,沒有任何解釋關(guān)于如何查看命令的輸出
所謂 “查端口占用”,即查看某個端口是否被某個程序占用,如果有,被哪個進(jìn)程占用。PS:進(jìn)程都有進(jìn)程ID標(biāo)識。
二、命令概覽
適用平臺 | 命令 | 作用 | 補(bǔ)充 |
---|---|---|---|
Linux | netstat -tunlp|grep 8080 | 查看占用8080端口的進(jìn)程ID | MacOS中用不了。看第四列(即本地地址),看完全匹配端口號的那行所對應(yīng)的PID。這個命令本身就查出LISTEN正在監(jiān)聽的! (Linux顯示為LISTEN,Windows顯示為LISTENING,一個意思) |
Windows | netstat -ano|findstr 8080 | 查看8080端口占用的進(jìn)程ID | findstr也可以用findStr,8080也可以用雙引號 “8080”。看第二列(即本地地址),看完全匹配端口號且狀態(tài)是LISTENING的那行所對應(yīng)的PID。 |
MacOS/Linux | lsof -i:8080 | 查看8080端口占用的進(jìn)程ID | MacOS中用,Linux可以用,但Linux可能默認(rèn)沒這個命令得自己裝。如果遇到問題可以嘗試加上sudo在前面:sudo lsof -i:8080 ,這個命令是精確匹配8080端口,不會將18080的占用顯示出來 |
注意,Linux的LISTEN狀態(tài)就是Windows里的LISTENING狀態(tài),一個意思用了不同單詞
三、命令的輸出結(jié)果詳細(xì)解釋
3.1、Windows:netstat -ano|findstr 8080
將端口號替換成你想查的的端口號即可
3.1.1、返回的結(jié)果類似于
這么多列,從左到右的含義是:協(xié)議、本地地址、外部地址、狀態(tài)、進(jìn)程ID
記不住使用 netstat -ano
可輸出表頭(注意表頭和值有點沒對齊)
netstat -ano|findstr 8080
的findstr,或者Linux的grep的含義是對前面的輸出的結(jié)果,即一行行的結(jié)果,過濾出帶有8080字符串的每一行,重新組成結(jié)果。過濾規(guī)則是前后模糊匹配,即%yourKeyword%,無論一行中哪列帶有8080字符串都會過濾出來,比如本地地址或外部地址都有可能因為含有8080而被匹配。顯然表頭因為不包含8080會被過濾掉,這就是為什么過濾后不顯示表頭的原因,你用netstat -ano|findstr 本地
就可以過濾出表頭。
3.1.2 命令的輸出結(jié)果解讀正式開始
如果什么都沒輸出,就是沒有任何進(jìn)程占用這個端口
如果有占用,至少會輸入如下
有時候復(fù)雜一點,會輸出
如何查看呢,這么多8080,而且進(jìn)程ID還不一樣
- 首先要看第二列,看第二列中是8080端口的
- 最后看 LISTENING 狀態(tài)的
這樣過濾后就會剩下2條,其中一條是IPv4另一條是IPv6,都是一樣的,提示被12636進(jìn)程占用
IPv4的寫法:0.0.0.0:8080,IPv6的寫法:[::]:8080
有時候會查不到LISTENING狀態(tài)的,但是又查出了其他的東西,這時候其實是沒有端口占用的
這種情況的出現(xiàn)是因為,比如8080本身是啟動的,被訪問后就會留下痕跡,然后8080的進(jìn)程被殺掉后則LISTENING狀態(tài)的立即會消失,但是其他狀態(tài)的還會緩存一段時間,實際測試過一段時間(具體我沒數(shù)多久)后再查,就什么都沒了
3.1.3 其他可能的疑惑的說明
-
為什么有2行?
一行是IPv4的,另一行IPv6。雖然2行但進(jìn)程ID其實是相同的,沒有不一致。其實詳細(xì)的我也不那么清楚,有知道更多細(xì)節(jié)的可以留言。
-
為什么要看第二列(本地地址),為什么是第二列不是第三列(外部地址),為什么要看 LISETNING 狀態(tài)的?
-
首先,基礎(chǔ)知識是,雙方要連接,則雙方的進(jìn)程都得有地址(IP和端口號)才能連,所以有兩個地址。
比如你在瀏覽器訪問某個網(wǎng)站,表面看似乎你本機(jī)不需要IP和端口,實際你打開瀏覽器的開發(fā)者工具,可以看到發(fā)出的每個請求,都有你本地
-
一般來說,你要查某個端口被占用,那這個端口肯定是被一直占用著才犯得著你來排查,所以要查 LISTENING 狀態(tài)的,因為 LISTENING 就是持久占用、正在監(jiān)聽中的。
-
要查看本地地址而不是遠(yuǎn)程,是因為本地地址才是某個服務(wù)啟動之后一直占用端口的,遠(yuǎn)程地址是遠(yuǎn)程要連接本機(jī)的IP和端口,肯定是不用管遠(yuǎn)程地址,畢竟遠(yuǎn)程地址要連接服務(wù)器用的一般都是臨時的端口號用完即回收的
我們在使用 jmeter 壓測的時候,其實是有個基礎(chǔ)知識的,就是你要模擬超過6萬多個用戶同時訪問某個接口,單機(jī)是不行的。因為,比如你的 jmeter 安裝在A機(jī)器,操作系統(tǒng)最多就65536個端口號,要在A機(jī)器同時模擬這么用戶,就得同時起這么多線程,一個線程代表一個用戶,那每個線程要占用一個端口號跟被壓測的服務(wù)器上的接口通信,一臺機(jī)器的最多65536個端口號被同時使用,所以一臺機(jī)器能同時壓測的數(shù)量自然是受到最大端口數(shù)限制的
-
第二列中的
0.0.0.0:8080
中,0.0.0.0
是指不限制遠(yuǎn)程的端口號熟悉 Redis 配置的都知道有個 bind 配置,0.0.0.0就是表示誰都可以連上來,而127.0.0.1就是只有本地可連,這樣子可以限制遠(yuǎn)程連上來的IP,更安全。這里是同樣的意思
-
3.2、Linux (有些原理的東西跟Windows一樣,建議有不清楚的可以翻看Windows的)
使用 netstat -tunlp|grep 8080
,該命令記憶tunlp,tun+lp,囤老婆。。。最后輸出的列的順序跟這些字母沒關(guān)系,例如netstat -tunpl|grep 8080
輸出的并不會調(diào)換列的位置
由于該命令的 l
參數(shù)只查出 LISTEN 狀態(tài)(即監(jiān)聽中)的了,所以不需要人工過濾監(jiān)聽中的狀態(tài)了,只需要看第4列的地址,即本地地址,只要看這列能完整匹配你要查的端口號即可,匹配后的那行的PID就是你要找的。
同樣的,你若不知道表頭,可以讓命令去掉grep的部分查一下,即 netstat -tunlp
查下,可以發(fā)現(xiàn)依次是:Proto,Recv-Q,Send-Q,Local Address,F(xiàn)oreign Address,State,PID/Program name
(TODO:補(bǔ)充截圖)
3.3、MacOS
3.3.1、使用 lsof -i:8080
可以查占用8080端口的程序,如果需要可以加sudo,如sudo lsof -i:8080
。
結(jié)果解讀
-
輸出的結(jié)果如下圖,有多個,但是要看LISTEN狀態(tài)的。
-
這個命令的端口參數(shù)是精確匹配的,即精確匹配8080,不會匹配到18080的端口的占用,我已經(jīng)做過了實驗,驗證過。
如下圖,如果某個端口沒有占用,則什么都沒
如下圖,如果雖然有輸出結(jié)果,但是沒有LISTEN狀態(tài)的(看箭頭括號里的),也是沒有任何程序占用
(為什么會沒有LISTEN狀態(tài)的?這個可能是因為之前的緩存,如果剛剛8080端口的程序被訪問過,然后8080端口程序立即被殺掉,就立即沒有LISTEN狀態(tài)的,但是因為訪問過8080端口的程序就會有點緩存,過一段時間再查就會發(fā)現(xiàn)以下的信息都沒了)
如下圖,如果有一條是LISTEN狀態(tài)的,這樣查看PID就找到了占用程序
怎么證明我上述 lsof -i:8080
查出來的8080而不是18080的?我同時啟動了8080和18080兩個web程序,可以看到lsof -i:8080
的結(jié)果沒有摻雜18080端口的結(jié)果,而且使用 lsof -i:18080
是能正確找到真正的占用程序的
3.3.2 使用 netstat 命令(明確這個命令似乎行不通)
MacOS也是可以使用 netstat
命令,只是參數(shù)跟 Linux的不太一樣,這是因為macOS 使用的是基于 BSD 的網(wǎng)絡(luò)工具,因此 netstat
命令的參數(shù)和輸出格式可能會與 Linux 中的稍有不同。
使用的命令是 netstat -an|grep 8080
,但是非常不幸的是這個命令不能輸出PID列, netstat --help
查看了幫助文檔似乎也沒什么參數(shù)可以支持,所以暫時無解,無法使用netstat在MacOS中查看端口占用。評論區(qū)知道的可以補(bǔ)充一下。
四、補(bǔ)充:
關(guān)于netstat的用法,在Linux/Windows中可以使用 netstat --help
列出后面的選項的字母代表的意思,Windows默認(rèn)輸出中文,還可以先 chcp 437
命令之后切換成英文之后再查命令的幫助。
- Windows 中文版和英文版
中文版如下
- Linux
(TODO待補(bǔ)充)
-
MacOS
-
lsof命令
-
netstat 命令
下面的命令提示了使用方式,似乎提示了 illegal option,也許
netstat --help
對于 macOS 來說并不是查看命令的方法,只是因為用錯了命令才提示正確的Usage?文章來源:http://www.zghlxwxcb.cn/news/detail-767085.html不管怎么樣,都提示了使用方式,如果不嫌長篇大論,可以使用
man nestat
查看命令的使用方式文章來源地址http://www.zghlxwxcb.cn/news/detail-767085.html
-
到了這里,關(guān)于如何查看端口占用(windows,linux,mac)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!