埠占用,無法透過netstat找到程序,佔用的埠又不能修改,該怎麼辦?

原子切割员發表於2024-06-19

最近遇到一個奇葩的問題,專案跑的好好的,沒有安裝其它特殊軟體,突然伺服器啟動報錯,日誌如下,顯然是伺服器的8080埠占用了。

Caused by: java.net.BindException: Address already in use: bind
        at sun.nio.ch.Net.bind0(Native Method)
        at sun.nio.ch.Net.bind(Net.java:438)
        at sun.nio.ch.Net.bind(Net.java:430)
        at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:225)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
        at org.apache.tomcat.util.net.NioEndpoint.initServerSocket(NioEndpoint.java:218)
        at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:194)
        at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1328)
        at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1341)
        at org.apache.tomcat.util.net.AbstractJsseEndpoint.init(AbstractJsseEndpoint.java:241)
        at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:695)
        at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11

很多同學容易想到的常規解決方法(windows上)就是使用如下命令找到對應的pid,然後進行關閉

netstat -ano | findstr :8080

但是我這邊用這個命令每次的結果都是空白的,也就是無法找到佔用8080埠的程序。

那麼windows埠占用,netstat無法找到,我們一般可以有哪些簡單和行之有效的解決方法呢?

方法1 強制關機

!!!就是按住電源鍵5秒以上,系統斷電。
有同學問為啥正常關機不就好了嗎?實際上也是經驗所得,正常關機有些程序會快取下來,佔用的埠也會在重啟後立馬就重新佔用。但是強制關機所有的程序及程式快取都會失效。

方法2 netstat 並使用windows10新增引數-q

透過查閱官網資料,從windows10開始,新增了一個-Q的引數能夠查詢出一種BOUND狀態下的程序,筆者無法找到的程序就是這種狀態的

使用示例:
netstat -anobq | findstr :8080


官網資料:
Netstat has been updated in Windows 10 with the addition of the -Q switch to show ports that have transitioned out of time wait as in the BOUND state. An update for Windows 8.1 and Windows Server 2012 R2 has been released that contains this functionality. The PowerShell cmdlet Get-NetTCPConnection in Windows 10 also shows these BOUND ports.

Until 10/2016, netstat was inaccurate. Fixes for netstat, back-ported to 2012 R2, allowed Netstat.exe and Get-NetTcpConnection to correctly report TCP or UDP port usage in Windows Server 2012 R2. See Windows Server 2012 R2: Ephemeral ports hotfixes to learn more.

方法3 修改windows動態埠範圍

有一些更新可能會使可使用埠的範圍有變化,比如Hyper-v
可使用如下命令更新保留埠範圍,保留埠範圍應該包含你使用埠

netsh interface ipv4 show excludedportrange protocol=tcp

net stop winnat

net stop LanmanWorkstation

net stop WlanSvc

net stop WwanSvc

netsh int ipv4 add excludedportrange protocol=tcp startport=8080 numberofports=1

net start winnat

net start LanmanWorkstation

net start WlanSvc

net start WwanSvc

使用如下命令更新動態埠範圍,該範圍應該在你使用的埠範圍外

netsh int ipv6 show dynamic tcp
netsh int ipv4 set dynamic tcp start=9001 num=16384

相關文章