Trouvez le PID d'un processus qui utilise un port sous Windows

Réponses:

217

Ouvrez simplement un shell de commande et tapez (en disant que votre port est 123456):

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

Vous verrez tout ce dont vous avez besoin.

Les en-têtes sont:

 Proto  Local Address          Foreign Address        State           PID
 TCP    0.0.0.0:37             0.0.0.0:0              LISTENING       1111
Thomas
la source
voici comment obtenir uniquement le pid, car il renvoie des détails entiers
Gobi M
Comment obtenir le seul formulaire PID ci-dessus résultats
Chinya
10
ou,nestat -aon | findstr 123456
ROMANIA_engineer
Un moyen simple d'y parvenir sous Windows est montré dans cette question - stackoverflow.com/questions/48198/…
Dracontis
4
pour windows / cygwin, ce serait probablement netstat -a -n -o | grep "123456"
WebComer
84

Trouvez le PID d'un processus qui utilise un port sous Windows (par exemple le port: "9999")

netstat -aon | find "9999"

-a Affiche toutes les connexions et tous les ports d'écoute.

-o Affiche l'ID de processus propriétaire associé à chaque connexion.

-n Affiche les adresses et les numéros de port sous forme numérique.

Production:

TCP    0.0.0.0:9999       0.0.0.0:0       LISTENING       15776

Puis tuez le processus par PID

taskkill /F /PID 15776

/F - Spécifie de forcer l'arrêt du ou des processus.

Remarque: vous aurez peut-être besoin d'une autorisation supplémentaire (exécutée par l'administrateur) pour tuer certains processus

am0wa
la source
Pourquoi netstat ne se ferme-t-il pas si vous ne lui donnez pas le drapeau n?
Jared Beach le
2
@JaredBeach - il attend la résolution de nom DNS inverse, donc il finira par se terminer une fois les délais d'attente terminés. Si cela se bloque sur les adresses IP internes , cela suggère un problème avec vos serveurs DNS locaux.
Steve Friedl
7

Si vous souhaitez effectuer cette opération par programme, vous pouvez utiliser certaines des options qui vous sont proposées comme suit dans un script PowerShell:

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

Toutefois; sachez que plus vous pouvez être précis, plus votre résultat PID sera précis. Si vous savez sur quel hôte le port est censé se trouver, vous pouvez le réduire beaucoup. netstat -aon | findstr "0.0.0.0:9999"ne renverra qu'une seule application et très probablement la bonne. Seule la recherche sur le numéro de port peut vous amener à renvoyer des processus qui ne s'y trouvent 9999que:

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

Le candidat le plus probable finit généralement en premier, mais si le processus s'est terminé avant d'exécuter votre script, vous risquez de vous retrouver avec le PID 12331 à la place et de tuer le mauvais processus.

eFox
la source
4

Après quelques manipulations avec un script, je suis arrivé à cette action. Copiez-le et enregistrez-le dans un fichier .bat:

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

Modifiez 'find "3306"' dans le numéro de port qui doit être libre. Exécutez ensuite le fichier en tant qu'administrateur. Cela tuera tous les processus en cours d'exécution sur ce port.

Quispie
la source
4

Commander:

netstat -aon | findstr 4723

Production:

TCP    0.0.0.0:4723           0.0.0.0:0                LISTENING       10396

Maintenant, coupez l'ID de processus, "10396", à l'aide de la forcommande sous Windows.

Commander:

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

Production:

10396

Si vous voulez couper le 4ème chiffre de la valeur signifie "ECOUTER" alors commande sous Windows.

Commander:

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

Production:

ÉCOUTE

Pavankumar Barot
la source
des suggestions pour filtrer le PID unique car la commande renvoie parfois le même processus plusieurs fois?
Krzysztof Krzeszewski le
2

Cela aide à trouver le PID à l'aide du numéro de port.

lsof -i tcp:port_number
Mahaveer Jangir
la source
1
Après avoir tapé la commande que j'ai reçue'lsof' is not recognized as an internal or external command.
Srinivas
Fonctionne sous Linux.
Mahaveer Jangir le
3
Cette question concerne Windows
acaruci
0

PowerShell (compatible Core) One-Liner pour faciliter les scénarios de 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

Production:

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

Même code, convivial pour les développeurs:

$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
la source