Trova il PID di un processo che utilizza una porta su Windows


Risposte:


217

Basta aprire una shell dei comandi e digitare (dicendo che la tua porta è 123456):

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

Vedrai tutto ciò di cui hai bisogno.

Le intestazioni sono:

 Proto  Local Address          Foreign Address        State           PID
 TCP    0.0.0.0:37             0.0.0.0:0              LISTENING       1111

ecco come ottengo solo il pid, poiché restituisce interi dettagli
Gobi M

come ottenere l'unico modulo PID sopra i risultati
Chinya

10
oppure,nestat -aon | findstr 123456
ROMANIA_engineer

Un modo semplice per ottenere questo risultato su Windows è mostrato in questa domanda :
stackoverflow.com/questions/48198/…

4
per windows / cygwin, probabilmente sarebbe netstat -a -n -o | grep "123456"
WebComer

84

Trova il PID di un processo che utilizza una porta su Windows (es. Porta: "9999")

netstat -aon | find "9999"

-a Visualizza tutte le connessioni e le porte di ascolto.

-o Visualizza l'ID del processo proprietario associato a ciascuna connessione.

-n Visualizza indirizzi e numeri di porta in formato numerico.

Produzione:

TCP    0.0.0.0:9999       0.0.0.0:0       LISTENING       15776

Quindi termina il processo con PID

taskkill /F /PID 15776

/F - Specifica di terminare forzatamente il / i processo / i.

Nota: potrebbe essere necessaria un'autorizzazione aggiuntiva (eseguita dall'amministratore) per terminare alcuni determinati processi


Perché netstat non esce se non gli dai il flag n?
Jared Beach

2
@JaredBeach - sta aspettando la risoluzione inversa del nome DNS, quindi finirà alla fine al termine dei timeout. Se si blocca su IP interni , suggerisce un problema con i server DNS locali.
Steve Friedl

7

Se si desidera eseguire questa operazione a livello di codice, è possibile utilizzare alcune delle opzioni fornite come segue in uno script di PowerShell:

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

Però; essere consapevoli che più si può essere accurati, più preciso sarà il risultato PID. Se sai su quale host dovrebbe essere la porta, puoi restringerlo molto. netstat -aon | findstr "0.0.0.0:9999"restituirà solo un'applicazione e molto probabilmente quella corretta. Solo la ricerca sul numero di porta può farti restituire processi che hanno solo 9999in esso, come questo:

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

Il candidato più probabile di solito finisce per primo, ma se il processo è terminato prima di eseguire lo script, potresti finire con il PID 12331 e uccidere il processo sbagliato.


4

Dopo aver armeggiato con una sceneggiatura sono arrivato a questa azione. Copia e salvalo in un file .bat:

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

Cambia "trova" 3306 "" nel numero di porta che deve essere libero. Quindi esegui il file come amministratore. Ucciderà tutti i processi in esecuzione su questa porta.


4

Comando:

netstat -aon | findstr 4723

Produzione:

TCP    0.0.0.0:4723           0.0.0.0:0                LISTENING       10396

Ora taglia l'ID del processo, "10396", utilizzando il forcomando in Windows.

Comando:

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

Produzione:

10396

Se vuoi tagliare il 4 ° numero del valore significa "ASCOLTO" allora comando in Windows.

Comando:

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

Produzione:

ASCOLTANDO


qualche suggerimento per filtrare PID univoco poiché il comando a volte restituisce lo stesso processo più volte?
Krzysztof Krzeszewski

2

Questo aiuta a trovare PID utilizzando il numero di porta.

lsof -i tcp:port_number

1
Dopo aver digitato il comando che ho ricevuto'lsof' is not recognized as an internal or external command.
Srinivas

Funziona su Linux.
Mahaveer Jangir

3
Questa domanda riguarda Windows
acaruci

0

One-liner PowerShell (compatibile con Core) per facilitare gli scenari di copypaste:

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

Produzione:

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

Stesso codice, intuitivo per gli sviluppatori:

$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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.