Estoy repasando este proceso muchas veces. Tengo que matar un proceso en una máquina con Windows y solo conozco su puerto. Normalmente, los pasos son los siguientes: Encuentre el PID mirando los puertos (ejemplo, puerto 8084) Enumere los procesos que se ejecutan en los puertos
netstat -a -o -n
Y luego elimine el proceso en ese puerto con el siguiente comando
taskkill /F /PID <pid>
¿Hay algo como una tubería o similar que pueda usar en el sistema operativo Windows para ejecutar este comando en una línea?
findstr
(Windowsgrep
). Por ejemplo:netstat -a -o -n | findstr "LISTENING" | findstr ":135"
. Tal vez esto te acerque un paso más;)findstr
: podría coincidir con el número de puerto local o remoto. (Aceptando que la Q no especifica cuál.)Respuestas:
Ambos
cmd.exe
y PowerShell admiten canalizaciones de un comando a otro. En PowerShell algo así (esto debería estar en una sola línea en la línea de comando, o usar `para escapar de las nuevas líneas en un script):Dónde:
Select -skip 4
omite las primeras cuatro líneas de encabezado. (Select
es la abreviatura deSelect-Object
utilizado para realizar SQL SELECT como proyectos de objetos.%
es la abreviatura deForeach-Object
que realiza un bloque de script en cada objeto ($_
) en la tubería y genera los resultados del bloque de script en la tubería. Aquí se divide primero la entrada en una matriz de campos y luego se crea un objeto nuevo con dos propiedades deOriginal
la cadenanetstat
yFields
la matriz que acaba de crear.?
es la abreviatura de losWhere-Object
filtros basados en el resultado de un bloque de script. Aquí coincide con una expresión regular al final del segundo campo (todos los contenedores de PowerShell están basados en cero).(Todos probados excepto el último elemento: no quiero comenzar a matar procesos :-)).
En la práctica, simplificaría esto, por ejemplo. devolviendo solo 0 o el PID desde el primero
foreach
(que estaría diseñado para ignorar los encabezados) y filtrar el valor no cero antes de llamartaskkill
. Esto sería más rápido de escribir pero más difícil de seguir sin conocer PowerShell.fuente
netstat
. Esto lleva a un error (probablemente inofensivo) deERROR: The process "12345" not found.
.taskkill /F /PID [PID]
. Con eso, alguien puede matar tareas manualmente siempre que tenga una forma de obtener el PID.Abra el símbolo del sistema y ejecute:
Si desea hacerlo en un .bat, reemplace % a por %% a .
Si solo quiere matar al que está escuchando en ese puerto, añada (^ | find "LISTENING") al final del otro find.
fuente
Aquí hay una función conveniente que puede usar:
https://github.com/majkinetor/posh/blob/master/MM_Network/Stop-ProcessByPort.ps1
fuente