Suchen Sie die PID eines Prozesses, der unter Windows einen Port verwendet


Antworten:


216

Öffnen Sie einfach eine Befehlsshell und geben Sie ein (sagen Sie, Ihr Port ist 123456):

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

Sie werden alles sehen, was Sie brauchen.

Die Überschriften sind:

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

hier wie bekomme ich nur die pid, da sie ganze details zurückgibt
Gobi M

wie man die einzige PID-Form über den Ergebnissen
erhält

10
odernestat -aon | findstr 123456
ROMANIA_engineer

Ein einfacher Weg, dies unter Windows zu erreichen, wird in dieser Frage gezeigt - stackoverflow.com/questions/48198/…
Dracontis

4
für windows / cygwin wäre es wahrscheinlich netstat -a -n -o | grep "123456"
WebComer

83

Suchen Sie die PID eines Prozesses, der unter Windows einen Port verwendet (z. B. Port: "9999").

netstat -aon | find "9999"

-a Zeigt alle Verbindungen und Überwachungsports an.

-o Zeigt die jeder Verbindung zugeordnete Prozess-ID an.

-n Zeigt Adressen und Portnummern in numerischer Form an.

Ausgabe:

TCP    0.0.0.0:9999       0.0.0.0:0       LISTENING       15776

Beenden Sie dann den Prozess per PID

taskkill /F /PID 15776

/F - Gibt an, dass die Prozesse zwangsweise beendet werden sollen.

Hinweis: Möglicherweise benötigen Sie eine zusätzliche Berechtigung (vom Administrator ausgeführt), um bestimmte Prozesse abzubrechen


Warum wird netstat nicht beendet, wenn Sie ihm nicht das Flag n geben?
Jared Beach

2
@JaredBeach - Es wartet auf die inverse Auflösung des DNS-Namens, sodass es nach Ablauf der Zeitüberschreitungen beendet wird. Wenn dies an internen IPs hängt , deutet dies auf ein Problem mit Ihren lokalen DNS-Servern hin.
Steve Friedl

7

Wenn Sie dies programmgesteuert ausführen möchten, können Sie einige der folgenden Optionen in einem PowerShell-Skript wie folgt verwenden:

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

Jedoch; Beachten Sie, dass Ihr PID-Ergebnis umso genauer ist, je genauer Sie sein können. Wenn Sie wissen, auf welchem ​​Host sich der Port befinden soll, können Sie ihn erheblich eingrenzen. netstat -aon | findstr "0.0.0.0:9999"gibt nur eine Anwendung zurück und höchstwahrscheinlich die richtige. Nur die Suche nach der Portnummer kann dazu führen, dass Sie Prozesse zurückgeben, die nur zufällig darin enthalten sind 9999:

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

Der wahrscheinlichste Kandidat landet normalerweise zuerst, aber wenn der Prozess beendet ist, bevor Sie Ihr Skript ausführen, erhalten Sie möglicherweise stattdessen die PID 12331 und beenden den falschen Prozess.


4

Nach einigem Fummeln mit einem Skript kam ich zu dieser Aktion. Kopieren und speichern Sie es in einer .bat-Datei:

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

Ändern Sie 'find "3306"' in der Portnummer, die frei sein muss. Führen Sie dann die Datei als Administrator aus. Alle Prozesse, die an diesem Port ausgeführt werden, werden abgebrochen.


4

Befehl:

netstat -aon | findstr 4723

Ausgabe:

TCP    0.0.0.0:4723           0.0.0.0:0                LISTENING       10396

Schneiden Sie nun die Prozess-ID "10396" mit dem forBefehl in Windows aus.

Befehl:

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

Ausgabe:

10396

Wenn Sie die 4. Zahl abschneiden möchten, bedeutet der Wert "HÖREN", dann Befehl in Windows.

Befehl:

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

Ausgabe:

HÖREN


Gibt es Vorschläge zum Filtern einer eindeutigen PID, da der Befehl manchmal denselben Prozess mehrmals zurückgibt?
Krzysztof Krzeszewski

2

Dies hilft, die PID anhand der Portnummer zu finden.

lsof -i tcp:port_number

1
Nachdem ich den Befehl eingegeben hatte, bekam ich'lsof' is not recognized as an internal or external command.
Srinivas

Funktioniert unter Linux.
Mahaveer Jangir

3
Diese Frage ist über Windows
Acaruci

0

PowerShell (Core-kompatibel) Einzeiler zur Vereinfachung von Copypaste-Szenarien:

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

Ausgabe:

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

Gleicher Code, entwicklerfreundlich:

$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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.