查找在 Windows 上使用端口的进程的 PID

我的服务在启动的时候崩溃了:

java.rmi.server.ExportException: Listen failed on port: 9999

我怎样才能找到杀死它的方法?

353029 次浏览

只需打开一个命令 shell 并键入(说明您的端口是123456) :

netstat -a -n -o | find "123456"

你会看到你需要的一切。

标题是:

 Proto  Local Address          Foreign Address        State           PID
TCP    0.0.0.0:37             0.0.0.0:0              LISTENING       1111

查找在 Windows < em > (例如端口: “9999”)上使用端口的进程的 PID

netstat -aon | find "9999"

显示所有连接和监听端口。

-o显示与每个连接关联的所属进程 ID。

-n以数字形式显示地址和端口号。

产出:

TCP    0.0.0.0:9999       0.0.0.0:0       LISTENING       15776

然后用 PID 杀死进程

taskkill /F /PID 15776

/F-指定强制终止进程。

注意: 您可能需要一个额外的权限(从管理员运行)来终止某些进程

在修改了一些脚本之后,我得到了这个操作。复制并保存到一个.bat 文件中:

FOR /F "usebackq tokens=5" %%i IN (`netstat -aon ^| find "3306"`) DO taskkill /F /PID %%i

在需要空闲的端口号中更改“ find“3306”。然后以管理员身份运行该文件。它将杀死在这个端口上运行的所有进程。

如果你想以编程的方式完成这项工作,你可以使用 PowerShell 脚本中提供的一些选项:

$processPID =  $($(netstat -aon | findstr "9999")[0] -split '\s+')[-1]
taskkill /f /pid $processPID

然而,请注意,您可以是更准确的,您的 PID 结果将是更精确的。如果您知道端口应该在哪个主机上,就可以大大缩小范围。netstat -aon | findstr "0.0.0.0:9999"只会返回一个应用程序,而且很可能是正确的应用程序。只搜索端口号可能会导致返回只有 9999在其中的进程,如下所示:

TCP    0.0.0.0:9999                        0.0.0.0:0       LISTENING       15776
UDP    [fe80::81ad:9999:d955:c4ca%2]:1900  *:*                             12331

最有可能的候选者通常最先结束,但是如果进程在运行脚本之前就已经结束,那么您可能会以 PID 12331结束,并杀死错误的进程。

这有助于使用端口号查找 PID。

lsof -i tcp:port_number

命令:

netstat -aon | findstr 4723

产出:

TCP    0.0.0.0:4723           0.0.0.0:0                LISTENING       10396

现在使用 Windows 中的 for命令剪切进程 ID“10396”。

命令:

for /f "tokens=5" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa

产出:

10396

如果你想切断值的第四个数字意味着“ LISTENING”,然后在 Windows 命令。

命令:

for /f "tokens=4" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa

产出:

倾听

PowerShell (核心兼容)一行程序来简化复制粘贴场景:

netstat -aon | Select-String 8080 | ForEach-Object { $_ -replace '\s+', ',' } | ConvertFrom-Csv -Header @('Empty', 'Protocol', 'AddressLocal', 'AddressForeign', 'State', 'PID') | ForEach-Object { $portProcess = Get-Process | Where-Object Id -eq $_.PID; $_ | Add-Member -NotePropertyName 'ProcessName' -NotePropertyValue $portProcess.ProcessName; Write-Output $_ } | Sort-Object ProcessName, State, Protocol, AddressLocal, AddressForeign | Select-Object  ProcessName, State, Protocol, AddressLocal, AddressForeign | Format-Table

产出:

ProcessName State     Protocol AddressLocal AddressForeign
----------- -----     -------- ------------ --------------
System      LISTENING TCP      [::]:8080    [::]:0
System      LISTENING TCP      0.0.0.0:8080 0.0.0.0:0

同样的代码,对开发人员友好:

$Port = 8080


# Get PID's listening to $Port, as PSObject
$PidsAtPortString = netstat -aon `
| Select-String $Port
$PidsAtPort = $PidsAtPortString `
| ForEach-Object { `
$_ -replace '\s+', ',' `
} `
| ConvertFrom-Csv -Header @('Empty', 'Protocol', 'AddressLocal', 'AddressForeign', 'State', 'PID')


# Enrich port's list with ProcessName data
$ProcessesAtPort = $PidsAtPort `
| ForEach-Object { `
$portProcess = Get-Process `
| Where-Object Id -eq $_.PID; `
$_ | Add-Member -NotePropertyName 'ProcessName' -NotePropertyValue $portProcess.ProcessName; `
Write-Output $_;
}


# Show output
$ProcessesAtPort `
| Sort-Object    ProcessName, State, Protocol, AddressLocal, AddressForeign `
| Select-Object  ProcessName, State, Protocol, AddressLocal, AddressForeign `
| Format-Table