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


Answers:


217

只需打开命令外壳并键入(假设您的端口为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

在这里,我如何只获取pid,因为它会返回全部详细信息
Gobi M

如何获得上述结果中唯一的PID表格
Chinya 2015年

10
nestat -aon | findstr 123456
ROMANIA_engineer

实现这一目标的Windows快捷方式显示在这个问题上- stackoverflow.com/questions/48198/...
Dracontis

4
对于Windows / cygwin,可能是netstat -a -n -o | grep“ 123456”
WebComer

84

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

netstat -aon | find "9999"

-a 显示所有连接和侦听端口。

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

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

输出:

TCP    0.0.0.0:9999       0.0.0.0:0       LISTENING       15776

然后通过PID终止进程

taskkill /F /PID 15776

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

注意:您可能需要额外的权限(由管理员运行)才能杀死某些特定进程


除非给nstat标志,否则为什么netstat不退出?
Jared Beach

2
@JaredBeach-它正在等待反向DNS名称解析,因此它将在超时完成后最终完成。如果这挂在内部 IP上,则表明本地DNS服务器存在问题。
史蒂夫·

7

如果要以编程方式执行此操作,则可以在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结尾,并杀死错误的过程。


4

经过一些脚本的摆弄之后,我开始执行此操作。复制并将其保存在.bat文件中:

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

更改需要查找的端口号中的“查找“ 3306””。然后以管理员身份运行文件。它将杀死此端口上运行的所有进程。


4

命令:

netstat -aon | findstr 4723

输出:

TCP    0.0.0.0:4723           0.0.0.0:0                LISTENING       10396

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

命令:

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

输出:

10396

如果要剪切该值的第4个数字,则表示“ LISTENING”,然后在Windows中命令。

命令:

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

输出:

聆听


关于过滤唯一PID的任何建议,因为该命令有时会多次返回相同的进程?
Krzysztof Krzeszewski


0

PowerShell(与Core兼容)的一线式可简化复制粘贴的情况:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.