Znajdź PID procesu, który używa portu w systemie Windows


Odpowiedzi:


217

Po prostu otwórz powłokę poleceń i wpisz (mówiąc, że twój port to 123456):

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

Zobaczysz wszystko, czego potrzebujesz.

Nagłówki to:

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

tutaj, jak mogę uzyskać tylko pid, ponieważ zwraca on całe szczegóły
Gobi M

jak uzyskać jedyny formularz PID powyższe wyniki
Chinya

11
lubnestat -aon | findstr 123456
ROMANIA_engineer

Łatwy sposób na osiągnięcie tego w systemie Windows jest pokazany w tym pytaniu - stackoverflow.com/questions/48198/…
Dracontis

4
dla windows / cygwin prawdopodobnie byłby to netstat -a -n -o | grep „123456”
WebComer

84

Znajdź PID procesu, który używa portu w systemie Windows (np. Port: „9999”)

netstat -aon | find "9999"

-a Wyświetla wszystkie połączenia i porty nasłuchu.

-o Wyświetla identyfikator procesu będącego właścicielem, powiązany z każdym połączeniem.

-n Wyświetla adresy i numery portów w postaci liczbowej.

Wynik:

TCP    0.0.0.0:9999       0.0.0.0:0       LISTENING       15776

Następnie zakończ proces za pomocą PID

taskkill /F /PID 15776

/F - Określa wymuszenie zakończenia procesu (ów).

Uwaga: możesz potrzebować dodatkowych uprawnień (uruchamianych od administratora), aby zabić niektóre procesy


Dlaczego netstat nie kończy pracy, chyba że dasz mu flagę n?
Jared Beach

2
@JaredBeach - czeka na odwrotne rozpoznawanie nazw DNS, więc ostatecznie zakończy się po przekroczeniu limitów czasu. Jeśli zawiesza się to na wewnętrznych adresach IP, oznacza to problem z lokalnymi serwerami DNS.
Steve Friedl

7

Jeśli chcesz to zrobić programowo, możesz użyć niektórych opcji podanych w następujący sposób w skrypcie PowerShell:

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

Jednak; pamiętaj, że im dokładniejszy możesz być, tym dokładniejszy będzie wynik PID. Jeśli wiesz, na którym hoście ma znajdować się port, możesz go bardzo zawęzić. netstat -aon | findstr "0.0.0.0:9999"zwróci tylko jedną aplikację i najprawdopodobniej poprawną. Tylko wyszukanie numeru portu może spowodować zwrócenie procesów, które tylko się 9999w nim znajdują, na przykład:

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

Najbardziej prawdopodobny kandydat zwykle kończy się jako pierwszy, ale jeśli proces zakończył się przed uruchomieniem skryptu, możesz zamiast tego otrzymać PID 12331 i zabić niewłaściwy proces.


4

Po trochę majstrowaniu przy scenariuszu doszedłem do tej akcji. Skopiuj i zapisz w pliku .bat:

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

Zmień „znajdź„ 3306 ”” w numerze portu, który musi być wolny. Następnie uruchom plik jako administrator. Zabije wszystkie procesy działające na tym porcie.


4

Komenda:

netstat -aon | findstr 4723

Wynik:

TCP    0.0.0.0:4723           0.0.0.0:0                LISTENING       10396

Teraz wytnij identyfikator procesu „10396”, używając forpolecenia w systemie Windows.

Komenda:

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

Wynik:

10396

Jeśli chcesz wyciąć 4. cyfrę wartości oznacza „SŁUCHANIE”, a następnie wydaj polecenie w systemie Windows.

Komenda:

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

Wynik:

SŁUCHAJĄCY


jakieś sugestie dotyczące filtrowania unikalnego PID, ponieważ polecenie czasami zwraca ten sam proces wielokrotnie?
Krzysztof Krzeszewski


0

Jednowierszowy PowerShell (zgodny z Core) ułatwiający tworzenie scenariuszy kopiowania:

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

Wynik:

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

Ten sam kod, przyjazny dla programistów:

$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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.