Encontre o PID de um processo que usa uma porta no Windows

Respostas:

217

Basta abrir um shell de comando e digitar (dizendo que sua porta é 123456):

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

Você verá tudo que você precisa.

Os cabeçalhos são:

 Proto  Local Address          Foreign Address        State           PID
 TCP    0.0.0.0:37             0.0.0.0:0              LISTENING       1111
Thomas
fonte
aqui, como obtenho apenas o pid, já que ele retorna detalhes inteiros
Gobi M
como obter o único formulário PID acima dos resultados
Chinya,
10
ounestat -aon | findstr 123456
ROMANIA_engineer
Uma maneira fácil de conseguir isso no Windows é mostrada nesta pergunta - stackoverflow.com/questions/48198/…
Dracontis
4
para windows / cygwin, provavelmente seria netstat -a -n -o | grep "123456"
WebComer
84

Encontre o PID de um processo que usa uma porta no Windows (por exemplo, porta: "9999")

netstat -aon | find "9999"

-a Exibe todas as conexões e portas de escuta.

-o Exibe o ID do processo proprietário associado a cada conexão.

-n Exibe endereços e números de porta em formato numérico.

Resultado:

TCP    0.0.0.0:9999       0.0.0.0:0       LISTENING       15776

Em seguida, elimine o processo por PID

taskkill /F /PID 15776

/F - Especifica o encerramento forçado do (s) processo (s).

Nota: Você pode precisar de uma permissão extra (executar do administrador) para encerrar alguns processos

am0wa
fonte
Por que netstat não sai, a menos que você dê a ele o sinalizador n?
Jared Beach
2
@JaredBeach - está aguardando a resolução inversa do nome DNS, portanto, terminará eventualmente após o término do tempo limite. Se isso travar em IPs internos , isso sugere um problema com seus servidores DNS locais.
Steve Friedl
7

Se quiser fazer isso programaticamente, você pode usar algumas das opções fornecidas a você da seguinte maneira em um script do PowerShell:

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

Contudo; esteja ciente de que quanto mais preciso você for, mais preciso será o resultado do PID. Se você souber em qual host a porta deve estar, você pode restringi-la muito. netstat -aon | findstr "0.0.0.0:9999"retornará apenas um aplicativo e, provavelmente, o correto. Apenas pesquisar o número da porta pode fazer com que você retorne processos que apenas possuem 9999nele, como este:

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

O candidato mais provável geralmente termina primeiro, mas se o processo terminou antes de você executar o script, você pode acabar com o PID 12331 e encerrar o processo errado.

eFox
fonte
4

Depois de mexer em um script, cheguei a esta ação. Copie e salve em um arquivo .bat:

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

Altere 'find "3306"' no número da porta que precisa ser livre. Em seguida, execute o arquivo como administrador. Isso vai matar todos os processos em execução nesta porta.

Quispie
fonte
4

Comando:

netstat -aon | findstr 4723

Resultado:

TCP    0.0.0.0:4723           0.0.0.0:0                LISTENING       10396

Agora corte o ID do processo, "10396", usando o forcomando no Windows.

Comando:

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

Resultado:

10396

Se você quiser cortar o 4º número do valor significa "LISTENING", então o comando no Windows.

Comando:

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

Resultado:

OUVINDO

Pavankumar Barot
fonte
alguma sugestão para filtrar PID exclusivo, já que o comando às vezes retorna o mesmo processo várias vezes?
Krzysztof Krzeszewski
2

Isso ajuda a encontrar o PID usando o número da porta.

lsof -i tcp:port_number
Mahaveer Jangir
fonte
1
Depois de digitar o comando que recebi'lsof' is not recognized as an internal or external command.
Srinivas
Funciona em Linux.
Mahaveer Jangir
3
Esta pergunta é sobre Windows
acaruci
0

PowerShell (compatível com Core) one-liner para facilitar os cenários de copypaste:

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

Resultado:

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

Mesmo código, amigável ao desenvolvedor:

$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
ElMesa
fonte