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
Thomas
quelle
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

am0wa
quelle
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.

eFox
quelle
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.

Quispie
quelle
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

Pavankumar Barot
quelle
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
Mahaveer Jangir
quelle
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
ElMesa
quelle