Encuentre el PID de un proceso que usa un puerto en Windows

Respuestas:

217

Simplemente abra un shell de comandos y escriba (diciendo que su puerto es 123456):

netstat -a -n -o | find "123456"

Verás todo lo que necesitas.

Los encabezados son:

 Proto  Local Address          Foreign Address        State           PID
 TCP    0.0.0.0:37             0.0.0.0:0              LISTENING       1111
Thomas
fuente
aquí, ¿cómo obtengo solo el pid, ya que devuelve los detalles completos
Gobi M
cómo obtener el único formulario PID anterior a los resultados
Chinya
10
o,nestat -aon | findstr 123456
RUMANIA_engineer
En esta pregunta se muestra una manera fácil de lograr esto en Windows - stackoverflow.com/questions/48198/…
Dracontis
4
para windows / cygwin, probablemente sería netstat -a -n -o | grep "123456"
WebComer
84

Busque el PID de un proceso que utiliza un puerto en Windows (por ejemplo, puerto: "9999")

netstat -aon | find "9999"

-a Muestra todas las conexiones y puertos de escucha.

-o Muestra el ID del proceso propietario asociado con cada conexión.

-n Muestra direcciones y números de puerto en forma numérica.

Salida:

TCP    0.0.0.0:9999       0.0.0.0:0       LISTENING       15776

Luego mata el proceso por PID

taskkill /F /PID 15776

/F - Especifica terminar forzosamente el (los) proceso (s).

Nota: es posible que necesite un permiso adicional (ejecutado por el administrador) para eliminar algunos procesos determinados

am0wa
fuente
¿Por qué no sale netstat a menos que le dé la bandera n?
Playa Jared
2
@JaredBeach: está esperando la resolución de nombres DNS inversa, por lo que finalmente terminará una vez que se hayan agotado los tiempos de espera. Si esto se cuelga de las direcciones IP internas , entonces sugiere un problema con sus servidores DNS locales.
Steve Friedl
7

Si desea hacer esto mediante programación, puede usar algunas de las opciones que se le brindan de la siguiente manera en un script de PowerShell:

$processPID =  $($(netstat -aon | findstr "9999")[0] -split '\s+')[-1]
taskkill /f /pid $processPID

Sin embargo; tenga en cuenta que cuanto más preciso pueda ser, más preciso será el resultado de su PID. Si sabe en qué host se supone que está el puerto, puede reducirlo mucho. netstat -aon | findstr "0.0.0.0:9999"solo devolverá una aplicación y muy probablemente la correcta. Solo buscar el número de puerto puede hacer que devuelva procesos que solo tienen 9999, como este:

TCP    0.0.0.0:9999                        0.0.0.0:0       LISTENING       15776
UDP    [fe80::81ad:9999:d955:c4ca%2]:1900  *:*                             12331

El candidato más probable suele terminar primero, pero si el proceso ha finalizado antes de ejecutar el script, puede terminar con el PID 12331 y eliminar el proceso incorrecto.

eFox
fuente
4

Después de jugar un poco con un guión llegué a esta acción. Cópielo y guárdelo en un archivo .bat:

FOR /F "usebackq tokens=5" %%i IN (`netstat -aon ^| find "3306"`) DO taskkill /F /PID %%i

Cambie 'find "3306"' en el número de puerto que debe estar libre. Luego ejecute el archivo como administrador. Matará todos los procesos que se ejecutan en este puerto.

Quispie
fuente
4

Mando:

netstat -aon | findstr 4723

Salida:

TCP    0.0.0.0:4723           0.0.0.0:0                LISTENING       10396

Ahora corte el ID de proceso, "10396", usando el forcomando en Windows.

Mando:

for /f "tokens=5" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa

Salida:

10396

Si desea cortar el cuarto número del valor significa "ESCUCHAR", entonces comando en Windows.

Mando:

for /f "tokens=4" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa

Salida:

ESCUCHANDO

Pavankumar Barot
fuente
¿Alguna sugerencia para filtrar PID único ya que el comando a veces devuelve el mismo proceso varias veces?
Krzysztof Krzeszewski
2

Esto ayuda a encontrar PID usando el número de puerto.

lsof -i tcp:port_number
Mahaveer Jangir
fuente
1
Después de escribir el comando obtuve'lsof' is not recognized as an internal or external command.
Srinivas
Funciona en Linux.
Mahaveer Jangir
3
Esta pregunta es sobre Windows
acaruci
0

PowerShell (compatible con Core) de una sola línea para facilitar los escenarios de copiar y pegar:

netstat -aon | Select-String 8080 | ForEach-Object { $_ -replace '\s+', ',' } | ConvertFrom-Csv -Header @('Empty', 'Protocol', 'AddressLocal', 'AddressForeign', 'State', 'PID') | ForEach-Object { $portProcess = Get-Process | Where-Object Id -eq $_.PID; $_ | Add-Member -NotePropertyName 'ProcessName' -NotePropertyValue $portProcess.ProcessName; Write-Output $_ } | Sort-Object ProcessName, State, Protocol, AddressLocal, AddressForeign | Select-Object  ProcessName, State, Protocol, AddressLocal, AddressForeign | Format-Table

Salida:

ProcessName State     Protocol AddressLocal AddressForeign
----------- -----     -------- ------------ --------------
System      LISTENING TCP      [::]:8080    [::]:0
System      LISTENING TCP      0.0.0.0:8080 0.0.0.0:0

Mismo código, amigable para desarrolladores:

$Port = 8080

# Get PID's listening to $Port, as PSObject
$PidsAtPortString = netstat -aon `
  | Select-String $Port
$PidsAtPort = $PidsAtPortString `
  | ForEach-Object { `
      $_ -replace '\s+', ',' `
  } `
  | ConvertFrom-Csv -Header @('Empty', 'Protocol', 'AddressLocal', 'AddressForeign', 'State', 'PID')

# Enrich port's list with ProcessName data
$ProcessesAtPort = $PidsAtPort `
  | ForEach-Object { `
    $portProcess = Get-Process `
      | Where-Object Id -eq $_.PID; `
    $_ | Add-Member -NotePropertyName 'ProcessName' -NotePropertyValue $portProcess.ProcessName; `
    Write-Output $_;
  }

# Show output
$ProcessesAtPort `
  | Sort-Object    ProcessName, State, Protocol, AddressLocal, AddressForeign `
  | Select-Object  ProcessName, State, Protocol, AddressLocal, AddressForeign `
  | Format-Table
ElMesa
fuente