Знайдіть PID процесу, який використовує порт в Windows


107

Мої сервісні збої при запуску з класичним:

java.rmi.server.ExportException: Listen failed on port: 9999

Як я можу знайти процес його вбивства?


Більш складні альтернативні рішення тут: stackoverflow.com/questions/48198/…
— Томас

Відповіді:


217

Просто відкрийте командну оболонку та введіть (сказавши, що ваш порт 123456):

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

Ви побачите все необхідне.

Заголовки:

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

ось як я дістаю лише pid, оскільки він повертає цілі деталі
— Gobi M

як отримати єдину форму PID над результатами
— Chinya

10
або,nestat -aon | findstr 123456
— ROMANIA_engineer

Простий спосіб досягти цього на windows показаний у цьому запитанні - stackoverflow.com/questions/48198/…
— Dracontis

4
для windows / cygwin, ймовірно, це буде netstat -a -n -o | grep "123456"
— WebComer

84

Знайдіть PID процесу, який використовує порт у Windows (наприклад, порт: "9999")

netstat -aon | find "9999"

-a Відображає всі порти підключення та прослуховування.

-o Показує ідентифікатор процесу володіння, пов'язаний з кожним з'єднанням.

-n Відображає адреси та номери портів у числовій формі.

Вихід:

TCP    0.0.0.0:9999       0.0.0.0:0       LISTENING       15776

Потім вбити процес за допомогою PID

taskkill /F /PID 15776

/F - Вказує для примусового припинення процесу.

Примітка. Можливо, вам знадобиться додатковий дозвіл (запустити від адміністратора), щоб вбити деякі певні процеси


Чому netstat не виходить, якщо ви не вказали його російський прапор?
— Пляж Джаред

2
@JaredBeach - він чекає зворотної роздільної здатності імені DNS, тому він з часом закінчиться після закінчення тайм-аутів. Якщо це зависає на внутрішніх IP-адресах, то це пропонує проблему з вашими локальними серверами DNS.
— Стів

7

Якщо ви хочете зробити це програмно, ви можете скористатися деякими з наведених нижче варіантів сценарію PowerShell:

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

Однак; пам’ятайте, що чим точніше ви можете бути точнішим, то ваш результат PID. Якщо ви знаєте, на якому порту повинен розміститися порт, ви можете значно звузити його. netstat -aon | findstr "0.0.0.0:9999"поверне лише одну програму, і це дуже подобається правильну. Тільки пошук за номером порту може призвести до того, що ви повернете процеси, які 9999у ньому трапляються лише так:

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

Найімовірніший кандидат, як правило, закінчується першим, але якщо процес закінчився перед запуском сценарію, ви можете замість цього отримати PID 12331 і вбити неправильний процес.


4

Після деякого спогаду зі сценарієм я прийшов до цієї дії. Скопіюйте та збережіть його у файлі .bat:

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

Змініть "знайти" 3306 "'у номері порту, який повинен бути безкоштовним. Потім запустіть файл як адміністратор. Це знищить усі процеси, що працюють на цьому порту.


4

Команда:

netstat -aon | findstr 4723

Вихід:

TCP    0.0.0.0:4723           0.0.0.0:0                LISTENING       10396

Тепер виріжте ідентифікатор процесу "10396", використовуючи forкоманду в Windows.

Команда:

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

Вихід:

10396

Якщо ви хочете вирізати 4-е число значення означає "СПИСОК", тоді командуйте в Windows.

Команда:

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

Вихід:

СЛУХАЛІ


якісь пропозиції щодо фільтрації унікального PID, оскільки команда іноді повертає один і той же процес кілька разів?
— Кшиштоф Кшешевський


0

Один вкладиш PowerShell (сумісний з Core) для полегшення сценаріїв копіювання пасти:

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

Вихід:

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

Той самий код, зручний для розробників:

$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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.