En Windows, ¿qué puede buscar el puerto 8080 e intentar eliminar el proceso que está utilizando a través de un archivo .BAT?
En Windows, ¿qué puede buscar el puerto 8080 e intentar eliminar el proceso que está utilizando a través de un archivo .BAT?
Respuestas:
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=5
lugar de tokens=4
.
Como funciona esto
FOR /F ... %variable IN ('command') DO otherCommand %variable...
Esto le permite ejecutar command
y recorrer su salida. Cada línea se rellenará %variable
y se puede expandir otherCommand
tantas veces como desee, donde quiera. %variable
en 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
). delims
parece 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 %P
en su lugar.
HELP FOR
en la línea de comandos para ver un montón de otras opciones que FOR
le dará, y comprobar netstat -?
, findstr /?
y TaskKill /?
para aún más ayuda.
tokens=4
Creo que es Windows XP y tokens=5
Windows 7. También es una buena idea /F
forzar el asesinato.
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
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
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
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
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
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 :
netstat :
Funciona porque netstat imprime el puerto de origen, luego el puerto de destino y luego ESTABLECIDO
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.
Si desea eliminar el proceso que está escuchando en el puerto 8080, puede usar PowerShell. Simplemente combine Get-NetTCPConnection
cmdlet 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"):
Similar a la respuesta de Merlyn, pero este también maneja estos casos:
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.
)
Pasos:
Vaya a la conf
carpeta de su servidor apache tomcat . En mi caso, es apache-tomcat-7.0.61\conf
como estoy usando apache-tomcat-7.0.61
Abra server.xml
y cambie el número de puerto de 8080 a cualquier otro puerto que desee. Por ejemplo: 8081,8082,8087 etc.
Ahora ve a la bin
carpeta y ejecutashutdown.bat
Ahora reinicie el servidor a través de eclipse.
Ahora su proyecto funcionará sin ninguna interrupción.
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
netstat
herramienta envolvente basada en PowerShell .
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 %%P
lugar de%P
netstat
herramienta está traducida a otros idiomas
si por sistema no puede finalizar la tarea. prueba este comando
x:> parada neta http / y