誰占了我的端口 for Windows


這篇文章發布於我的 github 博客:原文

今天在本地調試 Blog 的時候意外的出現了一些錯誤:127.0.0.1 4000 端口已經被其他的進程占用了。如何找到占用端口的進程呢?

Configuration file: /_config.yml
            Source: .
       Destination: ./_site
      Generating...
                    done.
  Please add the following to your Gemfile to avoid polling for changes:
    gem 'wdm', '>= 0.1.0' if Gem.win_platform?
 Auto-regeneration: enabled for '.'
Configuration file: /_config.yml
jekyll 2.4.0 | Error:  Permission denied - bind(2) for 127.0.0.1:4000

先手動一步一步來

我們可以使用 netstat 命令查看各種端口的被進程的占用情況,例如,開一個命令行或者 powershell 窗口輸入 netstat -ano。就得到了如下的報告。

TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       888
TCP    0.0.0.0:445            0.0.0.0:0              LISTENING       4
TCP    0.0.0.0:1536           0.0.0.0:0              LISTENING       564
TCP    0.0.0.0:1537           0.0.0.0:0              LISTENING       848
TCP    0.0.0.0:1538           0.0.0.0:0              LISTENING       1416
TCP    0.0.0.0:1539           0.0.0.0:0              LISTENING       1892
TCP    0.0.0.0:1540           0.0.0.0:0              LISTENING       732
TCP    0.0.0.0:1569           0.0.0.0:0              LISTENING       724
TCP    0.0.0.0:5357           0.0.0.0:0              LISTENING       4
TCP    127.0.0.1:1575         127.0.0.1:48303        ESTABLISHED     2104
TCP    127.0.0.1:4000         0.0.0.0:0              LISTENING       11476   <= Oops
TCP    127.0.0.1:4012         0.0.0.0:0              LISTENING       10888
TCP    127.0.0.1:4013         0.0.0.0:0              LISTENING       10888

說明一下參數:

  • -a:顯示所有鏈接和偵聽端口
  • -n:以數字形式顯示地址和端口號而不會去嘗試進行外部地址解析,能夠顯著的提高執行速度
  • -o:顯示擁有與每一個鏈接關聯的 PID。其實他還有一個 fancy 的參數 -b 可以直接拿到與指定鏈接關聯的可執行程序的名稱。但是這個參數需要管理員權限!

嫌疑人 Get,是一個 PID 為 11476 的進程占用了 4000 端口,除掉他之前先看看到底是誰?這個可以通過 tasklist /svc /FI "PID eq 11476" 搞定。

再說明一下參數:

  • /svc:如果這個進程是一個 Windows 服務的話同時顯示這個服務的名稱;
  • /FI:使用篩選器對結果進行篩選。

以下是運行結果:

Image Name                PID      Service
========================= ======== ============================================
FoxitProtect.exe             11476 FxService

好的,我昨天剛剛安裝了一個 FixitReader。停掉服務,一切搞定。

再來一個自動一點兒的

寫個 Powershell 腳本吧:

 param([string] $EndPointPattern)

 $pids = netstat -aon | ?{ $_.contains("$EndPointPattern") } | %{ $_.split(' ', [system.stringsplitoptions]::RemoveEmptyEntries)[4] } | select -unique
 $pids | %{ ps -Id $_ }

這里面沒有考慮各種亂七八糟的情況,如果要用,請自行增補細節。好了,運行一下吧:

$ .\Search-EndPointProcess.ps1 -EndPointPattern "127.0.0.1:48303"

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
   1047      30     8516       5044   178            2104   0 svchost

不錯嘛!😄


免責聲明!

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



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