誰(shuí)占了我的端口 for Windows
這篇文章發(fā)布于我的 github 博客:原文
今天在本地調(diào)試 Blog 的時(shí)候意外的出現(xiàn)了一些錯(cuò)誤:127.0.0.1 4000 端口已經(jīng)被其他的進(jìn)程占用了。如何找到占用端口的進(jìn)程呢?
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
先手動(dòng)一步一步來(lái)
我們可以使用 netstat 命令查看各種端口的被進(jìn)程的占用情況,例如,開(kāi)一個(gè)命令行或者 powershell 窗口輸入 netstat -ano。就得到了如下的報(bào)告。
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
說(shuō)明一下參數(shù):
- -a:顯示所有鏈接和偵聽(tīng)端口
- -n:以數(shù)字形式顯示地址和端口號(hào)而不會(huì)去嘗試進(jìn)行外部地址解析,能夠顯著的提高執(zhí)行速度
- -o:顯示擁有與每一個(gè)鏈接關(guān)聯(lián)的 PID。其實(shí)他還有一個(gè) fancy 的參數(shù) -b 可以直接拿到與指定鏈接關(guān)聯(lián)的可執(zhí)行程序的名稱(chēng)。但是這個(gè)參數(shù)需要管理員權(quán)限!
嫌疑人 Get,是一個(gè) PID 為 11476 的進(jìn)程占用了 4000 端口,除掉他之前先看看到底是誰(shuí)?這個(gè)可以通過(guò) tasklist /svc /FI "PID eq 11476" 搞定。
再說(shuō)明一下參數(shù):
- /svc:如果這個(gè)進(jìn)程是一個(gè) Windows 服務(wù)的話(huà)同時(shí)顯示這個(gè)服務(wù)的名稱(chēng);
- /FI:使用篩選器對(duì)結(jié)果進(jìn)行篩選。
以下是運(yùn)行結(jié)果:
Image Name PID Service
========================= ======== ============================================
FoxitProtect.exe 11476 FxService
好的,我昨天剛剛安裝了一個(gè) FixitReader。停掉服務(wù),一切搞定。
再來(lái)一個(gè)自動(dòng)一點(diǎn)兒的
寫(xiě)個(gè) Powershell 腳本吧:
param([string] $EndPointPattern)
$pids = netstat -aon | ?{ $_.contains("$EndPointPattern") } | %{ $_.split(' ', [system.stringsplitoptions]::RemoveEmptyEntries)[4] } | select -unique
$pids | %{ ps -Id $_ }
這里面沒(méi)有考慮各種亂七八糟的情況,如果要用,請(qǐng)自行增補(bǔ)細(xì)節(jié)。好了,運(yùn)行一下吧:
$ .\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
不錯(cuò)嘛!??
浙公網(wǎng)安備 33010602011771號(hào)