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


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.


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


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


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)


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


'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

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)

Jeśli wiesz, że port korzysta z protokołu IPv4, możesz zrobić to lsof -nt -i4TCP:9001samo.
Josh Habdas


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.

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.


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

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

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

-1

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

IISRESET
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.