Знайдіть 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.