Как убить процесс, использующий в настоящее время порт на локальном хосте в Windows?


Ответы:


1059

Шаг 1:

Откройте cmd.exe (примечание: вам может потребоваться запустить его как администратор, но это не всегда необходимо), а затем выполните следующую команду:

netstat -ano | findstr :PORT_NUMBER

(Замените PORT_NUMBER на номер порта, который вы хотите, но оставьте двоеточие)

Область, обведенная красным, показывает PID (идентификатор процесса). Найдите PID процесса, который использует нужный порт.

Шаг 2:

Далее выполните следующую команду:

taskkill /PID PID /F

(На этот раз без двоеточия)

Наконец, вы можете проверить, была ли операция успешной или нет, повторно выполнив команду в «Шаге 1». Если все прошло успешно, вы не увидите больше результатов поиска по этому номеру порта.


не работает. все еще процесс показ
Hardik Mandankaa

16
Работает отлично. В моем случае Tomcat работал в порту 8080, и мне нужно было снова запустить приложение Spring. i.imgur.com/aVwSYvR.png Большое вам спасибо.
Хьюго Л.М.

16
Я должен был ввести escape-символы при запуске taskkill:taskkill //PID 12552 //F
Роберт

1
принятый ответ не будет работать для сервисов, которые настроены на перезапуск при сбое (это не linux)
nurettin

1
я думаю, что вы имели в виду PID_NUMBER, а не PORT_NUMBER вtaskkill /PID PORT_NUMBER /F
Марчин Кулик

132

Шаг 1 (то же самое в принятом ответе, написанном KavinduWije ):

netstat -ano | findstr :yourPortNumber

Измените на шаге 2:

tskill typeyourPIDhere 

Примечание : taskkillне работает в некоторых терминалах git bash


1
не нашел его для меня
Цви Григорий Кайданов

1
@TzviGregoryKaidanov с какой проблемой вы сталкиваетесь?
afsarkhan10182

1
спасибо, это сработало, изменив taskkill на tskill
Md Shoaib Alam

1
Это решение, которое сработало для меня. Я использую GIT Bash.
dxhans5

1
Можно ли это сделать, передав выходные данные первой команды в seond?
Джеймс

115

С помощью стандартных инструментов Windows 10:

  • Шаг первый:

Откройте Windows PowerShell от имени администратора

  • Шаг второй:

Найти PID (ProcessID) для порта 8080:

netstat -aon | findstr 8080

TCP 0.0.0.0:8080 0.0.0.0:0 LISTEN 77777

  • Шаг третий:

Убить зомби процесс:

taskkill /f /pid 77777

где "77777" - ваш PID


1
Как автоматизировать процесс и объединить эти две команды в один bat-файл, если нет возможности просмотреть вывод cmd, а затем написать новую команду вручную?
Serob_b

3
@Serob_b set /p port="Enter port: "-> Порт ввода FOR /F "tokens=5" %%T IN ('netstat -aon ^| findstr %port% ') DO ( SET /A ProcessId=%%T) &GOTO SkipLine :SkipLine-> Извлекает PID в переменную taskkill /f /pid %ProcessId%-> Убивает задачу cmd /k -> Держит окно открытым
Викрант

94

Если вы используете GitBash

Шаг первый:

netstat -ano | findstr :8080

Шаг второй:

taskkill /PID typeyourPIDhere /F 

( /Fпринудительно завершает процесс)


двойная
косая черта

2
@ kylexy1357 попробуйте с одной косой чертой. «Двойная косая черта» - это escape-символ, предшествующий /, который не нужен для некоторых оболочек
Роберт

27

В Windows PowerShell версии 1 или новее для остановки процесса на порту 3000 введите:

Stop-Process (, (netstat -ano | findstr: 3000) .split () | foreach {$ [$ .length-1]}) -Force


Как подсказывает @morganpdx, здесь больше PowerShell-иш, лучшая версия:

Stop-Process -Id (Get-NetTCPConnection -LocalPort 3000). OwningProcess -Force


'Stop-Process' is not recognized as an internal or external command,
Зеленый,

3
Я считаю, что это работает:Stop-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess -Force
morganpdx

1
@Green Вам нужно запустить команду в Windows PowerShell
todorm

1
первый ошибочный, второй работал для меня
Том

24

Для использования в командной строке:

for /f "tokens=5" %a in ('netstat -aon ^| find ":8080" ^| find "LISTENING"') do taskkill /f /pid %a

Для использования в bat-файле:

for /f "tokens=5" %%a in ('netstat -aon ^| find ":8080" ^| find "LISTENING"') do taskkill /f /pid %%a

1
Если вы хотите сделать это в .bat, замените% a на %% a
Mahesh Narwade

23

Если вы уже знаете номер порта, возможно, будет достаточно отправить сигнал завершения работы программы (SIGTERM):

kill $(lsof -t -i :PORT_NUMBER)

Если вы знаете, что порт использует IPv4, вы также можете сделать это lsof -nt -i4TCP:9001.
Джош Хабдас


10

Я запускал zookeeper в Windows и не смог остановить ZooKeeper, работающий на порте 2181, используя zookeeper-stop.sh, поэтому попробовал этот метод двойной косой черты "//" для taskkill. Это сработало

     1. netstat -ano | findstr :2181
       TCP    0.0.0.0:2181           0.0.0.0:0              LISTENING       8876
       TCP    [::]:2181              [::]:0                 LISTENING       8876

     2.taskkill //PID 8876 //F
       SUCCESS: The process with PID 8876 has been terminated.

6

Если вы используете Windows Terminal, то процесс убийства может быть немного менее утомительным. Я использую терминал Windows и kill PIDотлично работаю, чтобы убить процессы в порту, так как новый терминал Windows поддерживает определенные команды bash. Например:kill 13300

Итак, весь процесс будет выглядеть так:

  • Откройте Windows Terminal
  • Введите следующую команду, чтобы показать процессы, запущенные на порте, который вы хотите уничтожить. netstat -ano | findstr :PORT
  • Введите следующую, чтобы убить процесс. kill PID

Например:

PS C:\Users\username> netstat -ano | findstr :4445
  TCP    0.0.0.0:4445           0.0.0.0:0              LISTENING       7368
  TCP    [::]:4445              [::]:0                 LISTENING       7368
PS C:\Users\username> kill 7368
PS C:\Users\username> netstat -ano | findstr :4445
PS C:\Users\username>

Посмотрите, когда я набрал первую команду для вывода списка процессов в порту, он вернулся пустым. Это означает, что все процессы сейчас убиты.


Я знаю, что это работает, потому что я проверял это, я пытаюсь найти документацию вокруг этого, у вас есть что-нибудь?
DanStarns

@DanStarns, я нашел только это до сих пор! docs.microsoft.com/en-us/windows/terminal
lazycipher

Спасибо за ваше время, это не совсем страница, которую я ищу, страница со всеми функциями, предоставляемыми в терминале, такими как kill. Я напишу здесь, если найду.
DanStarns

1
Я не нашел много об этом на данный момент. Пожалуйста, напишите, если вы найдете что-нибудь.
Ленивый

4

Вы можете сделать, запустив файл bat:

@ECHO OFF                                                                              
FOR /F "tokens=5" %%T IN ('netstat -a -n -o ^| findstr "9797" ') DO (
SET /A ProcessId=%%T) &GOTO SkipLine                                                   
:SkipLine                                                                              
echo ProcessId to kill = %ProcessId%
taskkill /f /pid %ProcessId%
PAUSE

4

Если вы хотите сделать это с помощью Python: проверьте, возможно ли в python завершить процесс, который прослушивает определенный порт, например 8080?

Ответ от Smunk работает хорошо. Я повторяю его код здесь:

from psutil import process_iter
from signal import SIGTERM # or SIGKILL

for proc in process_iter():
    for conns in proc.connections(kind='inet'):
        if conns.laddr.port == 8080:
            proc.send_signal(SIGTERM) # or SIGKILL
            continue

Это работало для сокета, который использует определенный номер порта в Google Cloud! Спасибо большое
peevesy

0

Однолинейное решение с использованием GitBash :

 tskill `netstat -ano | grep LISTENING | findstr :8080 | sed -r 's/(\s+[^\s]+){4}(.*)/\1/'`

Замените 8080 на порт, который слушает ваш сервер.

Если вам нужно использовать его часто, попробуйте добавить к вашей ~/.bashrcфункции:

function killport() {
        tskill `netstat -ano | findstr LISTENING | findstr :$1 | sed -r 's/^(\s+[^\s]+){4}(\d*)$/\1/'`
}

и просто беги

killport 8080

-1

Этого можно избежать, просто перезапустив IIS с помощью следующей команды:

IISRESET
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.