Jak zabić proces aktualnie korzystający z portu na localhost w systemie Windows?

490

Jak mogę usunąć bieżący proces / aplikację, która jest już przypisana do portu?

Na przykład: localhost:8080

KavinduWije
źródło

Odpowiedzi:

1054

Krok 1:

Otwórz program cmd.exe (uwaga: może być konieczne uruchomienie go jako administrator, ale nie zawsze jest to konieczne), a następnie uruchom poniższe polecenie:

netstat -ano | findstr :PORT_NUMBER

(Zamień PORT_NUMBER na żądany numer portu, ale zachowaj dwukropek)

Obszar zaznaczony na czerwono pokazuje PID (identyfikator procesu). Znajdź PID procesu korzystającego z żądanego portu.

Krok 2:

Następnie uruchom następujące polecenie:

taskkill /PID PID /F

(Tym razem nie ma dwukropka)

Na koniec możesz sprawdzić, czy operacja zakończyła się powodzeniem, ponownie uruchamiając polecenie w „kroku 1”. Jeśli się powiedzie, nie powinieneś widzieć więcej wyników wyszukiwania dla tego numeru portu.

KavinduWije
źródło
nie działa. proces wciąż jest wyświetlany
Hardik Mandankaa
16
Działa idealnie. W moim przypadku Tomcat działał w porcie 8080 i musiałem ponownie uruchomić aplikację Spring. i.imgur.com/aVwSYvR.png Dziękuję bardzo.
Hugo LM,
16
Musiałem wprowadzić znaki ucieczki podczas uruchamiania zadania:taskkill //PID 12552 //F
Robert
1
zaakceptowana odpowiedź nie będzie działać w przypadku usług skonfigurowanych do ponownego uruchomienia po awarii (to nie jest Linux)
nurettin
1
myślę, że miałeś na myśli PID_NUMBER, a nie PORT_NUMBER wtaskkill /PID PORT_NUMBER /F
Marcin Kulik
132

Krok 1 (to samo dotyczy zaakceptowanej odpowiedzi napisanej przez KavinduWije ):

netstat -ano | findstr :yourPortNumber

Zmień w kroku 2 na:

tskill typeyourPIDhere 

Uwaga : taskkillnie działa w niektórych terminalach git bash

afsarkhan10182
źródło
1
nie znalazłem tego dla mnie
Cwi Gregory Kaidanov
1
@TzviGregoryKaidanov z jakim problemem się mierzysz?
afsarkhan10182
1
dzięki, działało, zmieniając taskkill na tskill
Md Shoaib Alam
1
To rozwiązanie działało dla mnie. Używam GIT Bash.
dxhans5
1
Czy można tego dokonać przekazując wynik pierwszego polecenia do drugiego?
James
115

W przypadku domyślnych narzędzi systemu Windows 10:

  • Krok pierwszy:

Otwórz program Windows PowerShell jako administrator

  • Krok drugi:

Znajdź PID (ProcessID) dla portu 8080:

netstat -aon | findstr 8080

TCP 0.0.0.0:8080 0.0.0.0:0 LISTEN 77777

  • Krok trzeci:

Zabij proces zombie:

taskkill /f /pid 77777

gdzie „77777” jest Twoim PID

Duracell De Monaco
źródło
1
Jak zautomatyzować proces i połączyć te dwa polecenia razem w jednym pliku nietoperza, jeśli nie ma możliwości wyświetlenia wyniku cmd, a następnie ręcznego napisania nowego polecenia?
Serob_b,
3
@Serob_b set /p port="Enter port: "-> Port wejściowy FOR /F "tokens=5" %%T IN ('netstat -aon ^| findstr %port% ') DO ( SET /A ProcessId=%%T) &GOTO SkipLine :SkipLine-> Wyodrębnia PID do zmiennej taskkill /f /pid %ProcessId%-> Zabija zadanie cmd /k -> Nie zamykaj okna
Vikrant
94

Jeśli używasz GitBash

Krok pierwszy:

netstat -ano | findstr :8080

Krok drugi:

taskkill /PID typeyourPIDhere /F 

( /Fwymusza zakończenie procesu)

Ara Yaghsizian
źródło
podwójne
cięcie
2
@ kylexy1357 spróbuj z jednym ukośnikiem. „Podwójny ukośnik” to znak ucieczki poprzedzający /, który nie jest potrzebny w przypadku niektórych pocisków
Robert
27

W Windows PowerShell w wersji 1 lub nowszej, aby zatrzymać proces na porcie 3000:

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


Jak sugeruje @morganpdx tutaj jest więcej PowerShell-ish, lepsza wersja:

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

todorm
źródło
'Stop-Process' is not recognized as an internal or external command,
Zielony
3
Uważam, że to działa:Stop-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess -Force
morganpdx
1
@Zielony Musisz uruchomić polecenie w Windows PowerShell
todorm
1
pierwszy błąd, seconf zadziałał dla mnie
Tom
24

Do użytku w wierszu poleceń:

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

Do użytku w pliku bat:

for /f "tokens=5" %%a in ('netstat -aon ^| find ":8080" ^| find "LISTENING"') do taskkill /f /pid %%a
Mahesh Narwade
źródło
1
Jeśli chcesz to zrobić w .bat, zamień% a na %% a
Mahesh Narwade
23

Jeśli znasz już numer portu, prawdopodobnie wystarczy wysłać sygnał zakończenia oprogramowania do procesu (SIGTERM):

kill $(lsof -t -i :PORT_NUMBER)
Fellow Stranger
źródło
Jeśli wiesz, że port korzysta z protokołu IPv4, możesz zrobić to lsof -nt -i4TCP:9001samo.
Josh Habdas
10

Użytkownicy systemu Windows mogą skorzystać z narzędzia CurrPorts , aby łatwo zabić używane porty:

Wpisz opis zdjęcia tutaj

Zuhair Taha
źródło
10

Pracowałem w Zookeeper w systemie Windows i nie byłem w stanie zatrzymać ZooKeeper działającego na porcie 2181 przy użyciu zookeeper-stop.sh, więc wypróbowałem metodę podwójnego ukośnika „//” w celu wykonania zadania. Zadziałało

     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.
Spider_spider
źródło
6

Jeśli używasz terminala Windows, proces zabijania może być nieco mniej uciążliwy. Korzystam z terminala systemu Windows i kill PIDdziała dla mnie dobrze, aby zabijać procesy na porcie, ponieważ nowy terminal systemu Windows obsługuje niektóre polecenia bash. Na przykład:kill 13300

Cały proces będzie wyglądał następująco:

  • Otwórz terminal Windows
  • Wpisz następujące polecenie, aby wyświetlić procesy działające na porcie, na którym chcesz zabić procesy. netstat -ano | findstr :PORT
  • Wpisz następujące polecenie, aby zakończyć proces. kill PID

Na przykład:

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>

Zobacz, kiedy wpisałem pierwsze polecenie, aby wyświetlić listę procesów na porcie, który zwrócił pusty. Oznacza to, że wszystkie procesy są teraz zabijane.

lazycipher
źródło
Wiem, że to działa, ponieważ go przetestowałem, staram się znaleźć wokół niego dokumentację, czy masz jakieś?
DanStarns
@ DanStarns, jak dotąd znalazłem tylko to! docs.microsoft.com/en-us/windows/terminal
lazycipher
Dzięki za poświęcony czas, nie jest to strona, której szukam, strona ze wszystkimi funkcjami dostępnymi w terminalu, takimi jak kill. Złożę post tutaj, jeśli znajdę.
DanStarns
1
Na razie niewiele o tym wiem. Proszę pisać, jeśli coś znajdziesz.
lazycipher
4

Możesz to zrobić, uruchamiając plik nietoperza:

@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
flopcoder
źródło
4

Jeśli chcesz to zrobić za pomocą Pythona: sprawdź Czy w Pythonie można zabić proces nasłuchujący na określonym porcie, na przykład 8080?

Odpowiedź Smunka działa dobrze. Powtarzam jego kod tutaj:

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
Kardi Teknomo
źródło
Działa to również w przypadku gniazda, które używa określonego numeru portu w Google Cloud! Dzięki tonie
peevesy
0

Jedno liniowe rozwiązanie korzystające z GitBash :

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

Zamień 8080 na port, którego nasłuchuje serwer.

Jeśli musisz go często używać, spróbuj dodać do swojej ~/.bashrcfunkcji:

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

i po prostu biegnij

killport 8080
Italo Borssatto
źródło
-1

Możemy tego uniknąć, po prostu ponownie uruchamiając IIS, używając poniższego polecenia:

IISRESET
ksrider 148
źródło