Mate um processo procurando a porta que está sendo usada por um .BAT


128

No Windows, o que pode procurar pela porta 8080 e tentar eliminar o processo usado por meio de um arquivo .BAT?


Posso levá-lo até lá ... no prompt de comando, use o comando 'netstat -a -n -o' e você verá uma lista de processos e em quais portas estão ouvindo (assim como ip e se eles estão conectados a outro IP ou não ..) Inestimável. Certamente haverá opções mais agradáveis ​​para refinar os resultados, mas não consigo me lembrar deles imediatamente ... Espero que alguém possa aproveitar isso?
— Dave

No Linux você pode. se você instalar o cygwin você seria capaz de em aswell bat
— Dani

@Dani, Mike: Cygwin é uma dependência enorme e não é necessária para resolver esse problema. Se você já o possui, use-o - as ferramentas de linha de comando do linux são muito melhores.
— Merlyn Morgan-Graham

Respostas:


141

Aqui está um comando para você começar:

FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :8080') DO @ECHO TaskKill.exe /PID %%P

Quando estiver confiante no seu arquivo em lotes, remova @ECHO.

FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :8080') DO TaskKill.exe /PID %%P

Observe que você pode precisar alterar isso um pouco para diferentes sistemas operacionais. Por exemplo, no Windows 7, você pode precisar em tokens=5vez de tokens=4.

Como isso funciona

FOR /F ... %variable IN ('command') DO otherCommand %variable...

Isso permite que você execute commande faça um loop sobre sua saída. Cada linha será inserida %variablee poderá ser expandida otherCommandquantas vezes você quiser, onde quiser. %variableno uso real, só pode ter um nome de uma letra, por exemplo %V.

"tokens=4 delims= "

Isso permite que você divida cada linha por espaço em branco, pegue o quarto pedaço dessa linha e coloque-o %variable(no nosso caso %%P). delimsparece vazio, mas esse espaço extra é realmente significativo.

netstat -a -n -o

Basta executá-lo e descobrir. De acordo com a ajuda da linha de comando, ele "Exibe todas as conexões e portas de atendimento". "," Exibe endereços e números de portas em formato numérico. "E" Exibe o ID do processo proprietário associado a cada conexão. ". Eu apenas usei essas opções, já que alguém o sugeriu e funcionou :)

^|

Isso pega a saída do primeiro comando ou programa ( netstat) e a passa para um segundo programa de comando ( findstr). Se você estivesse usando isso diretamente na linha de comando, em vez de dentro de uma cadeia de comando, você usaria em |vez de ^|.

findstr :8080

Isso filtra qualquer saída que é passada para ele, retornando apenas as linhas que contêm :8080.

TaskKill.exe /PID <value>

Isso mata uma tarefa em execução, usando o ID do processo.

%%P instead of %P

Isso é necessário em arquivos em lote. Se você fez isso no prompt de comando, usaria %P.


Você pode precisar de jogar com fichas, delims, etc. Verifique HELP FORna linha de comando para ver um monte de outras opções que FORlhe dão, e verificar netstat -?, findstr /?e TaskKill /?para ainda mais ajuda.
— Merlyn Morgan-Graham

Vou experimentar e voltar para você.
— 11138 Mike

6
Os tokens FOR / F "= 5 delimites =" %% P IN ('netstat -a -n -o ^ | findstr: 8080') DO TaskKill.exe / F / PID %% P
— Mike Flynn em

10
Isso é ótimo. tokens=4é o Windows XP, eu acho, e o tokens=5Windows 7. Também é uma boa ideia /Fforçar a matança.
— Strelok

1
@ MerlynMorgan-Graham, pois esta é uma resposta aceita, por favor, considere a adição de pontos de stackoverflow.com/a/20637662/5243762 esta resposta bem
— IAmSurajBobade

196

Abra o prompt de comando e execute os seguintes comandos

 C:\Users\username>netstat -o -n -a | findstr 0.0:3000
   TCP    0.0.0.0:3000      0.0.0.0:0              LISTENING       3116

C:\Users\username>taskkill /F /PID 3116

, aqui 3116 é o ID do processo


Sim, isso será diferente em todos os lugares
— Mohit Singh

3
muito útil ! Mente você I procurar: 3000 em vez de 0,0: 3000, pois poderia sob 127.0.01 em vez de 0.0.0.0
— Leeeeeeelo

2
Obrigado, grande trabalho de matar um fora de controle tarefa Webpack dev :)
— danjah

Ou você pode simplesmente fornecer netstat -ano | findstr: 9797 skillkill / PID typeeyourPIDhere / F Aqui 9797 é o número da porta, eu freqüentemente uso esse comando para matar o servidor que está se comportando mal / com problemas.
— Mohit Singh

53

Para encontrar um processo específico na linha de comando, use o comando abaixo aqui 8080 é a porta usada pelo processo

netstat -ano | findstr 8080

matar processo use o comando abaixo aqui 21424 é o ID do processo

taskkill /pid 21424 /F 

@EralpB Enjoy :)
— Girdhar Singh Rathore

19

O uso da solução de Merlyn causou a morte de outros aplicativos, como o Firefox. Esses processos estavam usando a mesma porta, mas não como ouvinte:

por exemplo:

netstat -a -n -o | findstr :8085
  TCP    0.0.0.0:8085           0.0.0.0:0              LISTENING       6568
  TCP    127.0.0.1:49616        127.0.0.1:8085         TIME_WAIT       0
  TCP    127.0.0.1:49618        127.0.0.1:8085         TIME_WAIT       0

Portanto, é possível excluí-los adicionando "LISTENING" ao findstr da seguinte maneira:

FOR /F "tokens=5 delims= " %%P IN ('netstat -a -n -o ^| findstr :8085.*LISTENING') DO TaskKill.exe /PID %%P

18

Para listar todo o processo em execução na porta 8080, faça o seguinte.

netstat -ano | encontre "8080"

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       10612

TCP    [::]:8080              [::]:0                 LISTENING       10612

Em seguida, para matar o processo, execute o seguinte comando

skillkill / F / PID 10612


13

Obrigado a todos, apenas para adicionar que algum processo não será fechado, a menos que a opção / F force também seja enviada com o TaskKill. Também com a opção / T, todos os threads secundários do processo serão fechados.

C:\>FOR /F "tokens=5 delims= " %P IN ('netstat -a -n -o ^|
 findstr :2002') DO TaskKill.exe /PID %P /T /F

Para serviços, será necessário obter o nome do serviço e executar:

sc stop ServiceName


2

Apenas para conclusão:

Eu queria matar todos os processos conectados a uma porta específica, mas não o processo de escuta

o comando (no shell do cmd) para a porta 9001 é:

FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| findstr -rc:":9001[ ]*ESTA"') DO TaskKill /F /PID %P

findstr :

  • r é para expressões ec para a cadeia exata corresponder.
  • [] * é para espaços correspondentes

netstat :

  • a -> tudo
  • n -> não resolva (mais rápido)
  • o -> pid

Funciona porque o netstat imprime a porta de origem, a porta de destino e, em seguida, ESTABELECIDO


2

Criado um arquivo bat com o conteúdo abaixo, ele aceita a entrada para o número da porta

@ECHO ON
set /p portid=Enter the Port to be killed: 
echo %portid%                                                                              
FOR /F "tokens=5" %%T IN ('netstat -a -n -o ^| findstr %portid% ') DO (
SET /A ProcessId=%%T) &GOTO SkipLine                                                   
:SkipLine                                                                              
echo ProcessId to kill = %ProcessId%
taskkill /f /pid %ProcessId%
PAUSE

Por fim, clique em "Enter" para sair.


@TusharPandey Este é janelas com etiquetas pergunta, por isso é um script do Windows, não shell script
— Sireesh Yarlagadda

1

Se você deseja interromper o processo que está escutando na porta 8080, você pode usar o PowerShell. Basta combinar o Get-NetTCPConnectioncmdlet com Stop-Process.

Testado e deve funcionar com o PowerShell 5 no Windows 10 ou Windows Server 2016. No entanto, acho que também deve funcionar em versões mais antigas do Windows com o PowerShell 5 instalado.

Aqui está um exemplo:

PS C:\> Stop-Process -Id (Get-NetTCPConnection -LocalPort 8080).OwningProcess

Confirm
Are you sure you want to perform the Stop-Process operation on the following item: MyTestServer(9408)?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"):

0

Semelhante à resposta de Merlyn, mas esta também lida com esses casos:

  • O número da porta é na verdade uma substring esquerda de outro número de porta mais longo que você não está procurando. Você deseja procurar um número de porta exato para não matar um processo aleatório e inocente!
  • O código de script precisa poder executar mais de uma vez e estar correto a cada vez, não mostrando respostas antigas e incorretas.

Aqui está:

set serverPid=
for /F "tokens=5 delims= " %%P in ('netstat -a -n -o ^| findstr /E :8080 ') do set serverPid=%%P
if not "%serverPid%" == "" (
  taskkill /PID %serverPid%
) else (
  rem echo Server is not running.
)

0

Passos:

  1. Vá para a confpasta do seu servidor apache tomcat . No meu caso, é apache-tomcat-7.0.61\confcomo eu estou usando apache-tomcat-7.0.61

  2. Abra server.xmle altere o número da porta de 8080 para qualquer outra porta como desejar. Por exemplo: 8081,8082,8087 etc

  3. Agora vá para a binpasta e executeshutdown.bat

  4. Agora reinicie o servidor através do eclipse.

Agora seu projeto funcionará sem interrupção.


0

Se alguém estiver procurando por um Script do Powershell:

function Search-And-Destroy
{
    param ( [Parameter(Mandatory=$true)][string]$port )
    $lines = netstat -a -o -n | findstr $port
    $ports = @()

    ForEach($line In $lines)
    {
        $res = $($lines -split '\s+')
        $ports += $res[5]
    }

    $ports = $ports | select -uniq

    ForEach($port In $ports)
    {
        echo $(taskkill /F /PID $port)
    }
}

Essa função basicamente faz o que as funções acima fazem, mas está no formato de script do Powershell, para que você possa adicioná-lo ao seu perfil do Powershell. Para encontrar a localização do seu perfil, vá para o PowerShell e digiteecho $profile


1
Este não é realmente um script do PowerShell, mas um wrapper baseado no PowerShell em torno da netstatferramenta.
— bahrep

0

Cole isso na linha de comando

FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| find "LISTENING" ^| find ":8080 "') DO (TASKKILL /PID %P)

Se você quiser usá-lo em um lote pu em %%Pvez de%P


Isso depende do idioma do sistema operacional, alguma maneira de fazê-lo funcionar em todos os idiomas?
— Jakob

@Jakob Isso só pode ser executado no terminal cmd no Windows, também apenas nos arquivos .cmd ou .bat
— Eduard Florinescu

Sim, mas apenas no idioma inglês, pois caso contrário, "LISTENING" será traduzido para o idioma do sistema operacional.
— Jakob

@Jakob Não sei que a netstatferramenta foi traduzida para outros idiomas
— Eduard Florinescu

0

se você pelo sistema, você não pode terminar a tarefa. tente este comando

x:> parada de rede http / y


3
O que significa "se você pelo sistema"? E como essa resposta é melhor do que todas as outras?
— Nico Haase
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.