Windows: A maneira mais rápida de eliminar um processo em execução em uma porta específica

11

Estou analisando esse processo várias vezes. Eu tenho que matar um processo em uma máquina Windows e apenas conheço sua porta. Normalmente, as etapas são as seguintes: Encontre o PID observando as portas (porta 8084 de exemplo) Liste os processos em execução nas portas

netstat -a -o -n

E então mate o processo nessa porta com o seguinte comando

taskkill /F /PID <pid>

Existe algo como um pipe ou similar que eu possa usar no sistema operacional Windows para executar este comando em uma linha !?

Armand
fonte
1
Lamento não poder escrever uma resposta completa no momento, mas consulte findstr(o Windows grep). Por exemplo: netstat -a -o -n | findstr "LISTENING" | findstr ":135". Talvez isso você fica um passo mais perto;)
Der Hochstapler
@OliverSalzburg Precisa ter cuidado com o segundo findstr: pode corresponder ao número da porta local ou remota. (Aceitar que o Q não especifica qual.)
Richard

Respostas:

10

Existe algo como um pipe ou similar que eu possa usar no sistema operacional Windows para executar este comando em uma linha?

O cmd.exePowerShell e o suporte a canais de um comando para outro. No PowerShell, algo como (isso deve estar em uma única linha na linha de comando ou use `para escapar de novas linhas em um script):

netstat -ano
 | select -skip 4 
 | % {$a = $_ -split ' {3,}'; New-Object 'PSObject' -Property @{Original=$_;Fields=$a}} 
 | ? {$_.Fields[1] -match '15120$'}
 | % {taskkill /F /PID $_.Fields[4] }

Onde:

  • Select -skip 4pula as quatro primeiras linhas do cabeçalho. ( Selecté a abreviação de Select-Objectusado para executar o SQL SELECT como projetos de objetos.
  • %é curto para o Foreach-Objectqual executa um bloco de script em cada objeto ( $_) no pipeline e gera os resultados do bloco de script no pipeline. Aqui, ele primeiro divide a entrada em uma matriz de campos e, em seguida, cria um objeto novo com duas propriedades das quais Originala string netstate Fieldsa matriz recém-criada.
  • ?é curto para Where-Objectquais filtros com base no resultado de um bloco de script. Aqui corresponde a uma regex no final do segundo campo (todos os contêineres do PowerShell são baseados em zero).

(Todos testados, exceto o último elemento: eu não quero começar a matar processos :-)).

Na prática, eu simplificaria isso, por exemplo. retornando apenas 0 ou o PID do primeiro foreach(que seria projetado para ignorar os cabeçalhos) e filtrar o valor não zero antes de chamar taskkill. Seria mais rápido digitar, mas mais difícil de seguir sem conhecer o PowerShell.

Richard
fonte
por alguma razão, meu PowerShell não reconhece o select! Executando o Windows 7 "Der Befehl", selecione "istwent false". Mesmo para "Selecionar objeto"
Armand
Isso funcionou para mim, mas o processo é encontrado duas vezes, acredito que devido às versões do IPv4 e IPv6 serem listadas por netstat. Isso leva a um erro (provavelmente inofensivo) de ERROR: The process "12345" not found..
Scott Weldon
Eu acho que o assunto importante aqui é taskkill /F /PID [PID]. Com isso, alguém pode matar tarefas manualmente, desde que tenha uma maneira de obter o PID.
Sawtaytoes
1

Abra o prompt de comando e execute:

for /f "tokens=5" %a in ('netstat -aon ^| find "8080"') do taskkill /f /pid %a

Se você quiser fazer isso em um .bat, substitua % a por %% a .

Se você quiser apenas matar o que está ouvindo nessa porta, adicione (^ | find "LISTENING") no final da outra localização.

Josep Alsina
fonte