Найдите 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
11
или,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 - Задает принудительное завершение процесса (ов).

Примечание: вам может потребоваться дополнительное разрешение (запуск от администратора), чтобы убить некоторые определенные процессы.

am0wa
источник
Почему netstat не завершает работу, если вы не укажете флаг n?
Джаред Бич
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 и убить не тот процесс.

eFox
источник
4

Поработав со сценарием, я пришел к этому действию. Скопируйте и сохраните его в файле .bat:

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

Измените "найти" 3306 "в номере порта, который должен быть свободным. Затем запустите файл от имени администратора. Это убьет все процессы, запущенные на этом порту.

Quispie
источник
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, поскольку команда иногда возвращает один и тот же процесс несколько раз?
Krzysztof Krzeszewski 04
2

Это помогает найти PID по номеру порта.

lsof -i tcp:port_number
Махавир Джангир
источник
1
После набора команды я получил'lsof' is not recognized as an internal or external command.
Шринивас
Работает в Linux.
Mahaveer Jangir
3
Этот вопрос касается Windows
acaruci
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
ЭльМеса
источник