Elimine un proceso buscando el puerto que está utilizando desde un .BAT

128

En Windows, ¿qué puede buscar el puerto 8080 e intentar eliminar el proceso que está utilizando a través de un archivo .BAT?

Mike Flynn
fuente
Puedo hacerte parte del camino allí ... desde el símbolo del sistema, usa el comando 'netstat -a -n -o' y verás una lista de procesos y en qué puertos están escuchando (así como ip y si están conectados a otra IP o no ...) Invaluable. Es casi seguro que habrá mejores interruptores para refinar los resultados, pero no puedo recordarlos de antemano ... ¿Espero que alguien pueda construir sobre esto?
Dave
En linux puedes. si instala cygwin también podría hacerlo en el bate
Dani
@Dani, Mike: Cygwin es una gran dependencia y no se requiere para resolver este problema. Sin embargo, si ya lo tiene, úselo: las herramientas de línea de comandos de Linux son mucho mejores.
Merlyn Morgan-Graham

Respuestas:

141

Aquí hay un comando para comenzar:

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

Cuando esté seguro de su archivo por lotes, elimínelo @ECHO.

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

Tenga en cuenta que es posible que deba cambiar esto ligeramente para diferentes sistemas operativos. Por ejemplo, en Windows 7 puede necesitar en tokens=5lugar de tokens=4.

Como funciona esto

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

Esto le permite ejecutar commandy recorrer su salida. Cada línea se rellenará %variabley se puede expandir otherCommandtantas veces como desee, donde quiera. %variableen uso real solo puede tener un nombre de una sola letra, por ejemplo %V.

"tokens=4 delims= "

Esto le permite dividir cada línea por espacios en blanco, y tomar el cuarto trozo en esa línea, y meterlo en %variable(en nuestro caso, %%P). delimsparece vacío, pero ese espacio extra es realmente significativo.

netstat -a -n -o

Solo ejecútalo y descúbrelo. De acuerdo con la ayuda de la línea de comandos, "Muestra todas las conexiones y puertos de escucha", "Muestra las direcciones y los números de puerto en forma numérica" ​​y "Muestra el ID del proceso propietario asociado con cada conexión". Acabo de usar estas opciones ya que alguien más lo sugirió, y resultó que funcionaba :)

^|

Esto toma la salida del primer comando o programa ( netstat) y lo pasa a un segundo programa de comando ( findstr). Si estuviera usando esto directamente en la línea de comando, en lugar de dentro de una cadena de comando, lo usaría en |lugar de ^|.

findstr :8080

Esto filtra cualquier salida que se le pase, devolviendo solo las líneas que contienen :8080.

TaskKill.exe /PID <value>

Esto mata una tarea en ejecución, utilizando la ID del proceso.

%%P instead of %P

Esto es obligatorio en los archivos por lotes. Si hiciste esto en el símbolo del sistema, lo utilizarías %Pen su lugar.

Merlyn Morgan-Graham
fuente
Puede que tenga que jugar con fichas, delims, etc. Comprobar HELP FORen la línea de comandos para ver un montón de otras opciones que FORle dará, y comprobar netstat -?, findstr /?y TaskKill /?para aún más ayuda.
Merlyn Morgan-Graham
Lo intentaré y te responderé.
Mike Flynn
66
FOR / F "tokens = 5 delims =" %% P IN ('netstat -a -n -o ^ | findtr: 8080') DO TaskKill.exe / F / PID %% P
Mike Flynn
10
Esto es genial. tokens=4Creo que es Windows XP y tokens=5Windows 7. También es una buena idea /Fforzar el asesinato.
Strelok
1
@ MerlynMorgan-Graham ya que esta es una respuesta aceptada, considere agregar puntos de stackoverflow.com/a/20637662/5243762 esta respuesta también
IAmSurajBobade
196

Abra el símbolo del sistema y ejecute los siguientes 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

, aquí 3116 es el ID del proceso

Mohit Singh
fuente
sí, eso será diferente en todas partes
Mohit Singh
3
muy útil ! Eso sí, busco: 3000 en lugar de 0.0: 3000 porque podría ser inferior a 127.0.01 en lugar de 0.0.0.0
Leeeeeeelo
2
Gracias, gran trabajo matando una tarea de desarrollo webpack fuera de control :)
danjah
O simplemente puede proporcionar netstat -ano | findtr: 9797 taskkill / PID typeyourPIDhere / F Aquí 9797 es el número de puerto, con frecuencia uso este comando para matar el servidor mal comportamiento / colgado.
Mohit Singh
53

Para encontrar un proceso específico en la línea de comando, use el siguiente comando aquí 8080 es el puerto utilizado por el proceso

netstat -ano | findstr 8080

para matar el proceso use el siguiente comando aquí 21424 es la identificación del proceso

taskkill /pid 21424 /F 
Girdhar Singh Rathore
fuente
@EralpB Enjoy :)
Girdhar Singh Rathore
19

El uso de la solución de Merlyn provocó la eliminación de otras aplicaciones como Firefox. Estos procesos estaban usando el mismo puerto, pero no como un oyente:

p.ej:

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

Por lo tanto, puede excluirlos agregando "LISTENING" al FindStr de la siguiente manera:

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

Para enumerar todo el proceso que se ejecuta en el puerto 8080, haga lo siguiente.

netstat -ano | encontrar "8080"

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       10612

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

Luego, para matar el proceso, ejecute el siguiente comando

taskkill / F / PID 10612

Sardesh Sharma
fuente
13

Gracias a todos, solo por agregar que algún proceso no se cerrará a menos que el modificador de fuerza / F también se envíe con TaskKill. También con el interruptor / T, se cerrarán todos los subprocesos secundarios del proceso.

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

Para los servicios será necesario obtener el nombre del servicio y ejecutar:

sc stop ServiceName

xtrm
fuente
2

Solo para completar:

Quería matar todos los procesos conectados a un puerto específico pero no el proceso de escucha

El comando (en cmd shell) para el puerto 9001 es:

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

Findstr :

  • r es para expresiones yc para que la cadena exacta coincida.
  • [] * es para espacios coincidentes

netstat :

  • a -> todos
  • n -> no resolver (más rápido)
  • o -> pid

Funciona porque netstat imprime el puerto de origen, luego el puerto de destino y luego ESTABLECIDO

Boop
fuente
2

Creó un archivo bat con el contenido a continuación, acepta la entrada para el número de puerto

@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

Finalmente haga clic en "Enter" para salir.

Sireesh Yarlagadda
fuente
@TusharPandey Esta es una pregunta etiquetada de Windows, por lo que es un script de Windows, no un script de shell
Sireesh Yarlagadda
1

Si desea eliminar el proceso que está escuchando en el puerto 8080, puede usar PowerShell. Simplemente combine Get-NetTCPConnectioncmdlet con Stop-Process.

Probado y debería funcionar con PowerShell 5 en Windows 10 o Windows Server 2016. Sin embargo, supongo que también debería funcionar en versiones anteriores de Windows que tengan instalado PowerShell 5.

Aquí hay un ejemplo:

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
fuente
0

Similar a la respuesta de Merlyn, pero este también maneja estos casos:

  • El número de puerto es en realidad una subcadena izquierda de otro número de puerto más largo que no está buscando. ¡Desea buscar un número de puerto exacto para no matar un proceso inocente al azar!
  • El código del script debe poder ejecutarse más de una vez y ser correcto cada vez, sin mostrar respuestas antiguas e incorrectas.

Aquí 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
fuente
0

Pasos:

  1. Vaya a la confcarpeta de su servidor apache tomcat . En mi caso, es apache-tomcat-7.0.61\confcomo estoy usando apache-tomcat-7.0.61

  2. Abra server.xmly cambie el número de puerto de 8080 a cualquier otro puerto que desee. Por ejemplo: 8081,8082,8087 etc.

  3. Ahora ve a la bincarpeta y ejecutashutdown.bat

  4. Ahora reinicie el servidor a través de eclipse.

Ahora su proyecto funcionará sin ninguna interrupción.

Vineetha Swathi
fuente
0

Si alguien está buscando un Script 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)
    }
}

Esta función básicamente hace lo que hacen las funciones anteriores, pero está en el formato de secuencia de comandos de Powershell para que pueda agregarla a su perfil de Powershell. Para encontrar la ubicación de su perfil, vaya a powershell y escribaecho $profile

Watzon
fuente
1
Esto no es realmente un script de PowerShell, sino una netstatherramienta envolvente basada en PowerShell .
bahrep el
0

Pegue esto en la línea de comando

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

Si desea usarlo en un lote de pu en %%Plugar de%P

Eduard Florinescu
fuente
Esto depende del idioma del sistema operativo, ¿alguna forma de hacerlo funcionar para todos los idiomas?
Jakob
@Jakob Esto solo se puede ejecutar en el terminal cmd en Windows, también solo en archivos .cmd o .bat
Eduard Florinescu
Sí, pero solo en inglés, ya que de lo contrario "ESCUCHAR" se traducirá al idioma del sistema operativo.
Jakob
@Jakob No sé si la netstatherramienta está traducida a otros idiomas
Eduard Florinescu
0

si por sistema no puede finalizar la tarea. prueba este comando

x:> parada neta http / y

Nrawut Phrommahit
fuente
3
¿Qué significa "si usted por sistema" significa? ¿Y cómo es esta respuesta mejor que todas las demás?
Nico Haase