這篇文章發布於我的 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
不錯嘛!😄