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?

Mike Flynn
fonte
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.

Merlyn Morgan-Graham
fonte
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

Mohit Singh
fonte
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 
Girdhar Singh Rathore
fonte
@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
Solubris
fonte
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

Sardesh Sharma
fonte
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

xtrm
fonte
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

Boop
fonte
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.

Sireesh Yarlagadda
fonte
@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"):
bahrep
fonte
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.
)
Yavin5
fonte
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.

Vineetha Swathi
fonte
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

Watzon
fonte
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

Eduard Florinescu
fonte
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

Nrawut Phrommahit
fonte
3
O que significa "se você pelo sistema"? E como essa resposta é melhor do que todas as outras?
Nico Haase