Zabij proces, wyszukując używany przez niego port z pliku .BAT


128

W systemie Windows, co może szukać portu 8080 i próbować zabić proces, którego używa, za pomocą pliku .BAT?


Mogę ci pomóc ... z wiersza poleceń użyj polecenia `` netstat -a -n -o '', a zobaczysz listę procesów i portów, na których nasłuchują (a także ip i czy są podłączone do innego adresu IP lub nie ..) Nieocenione. Prawie na pewno będą ładniejsze przełączniki, które pozwolą zawęzić wyniki, ale nie pamiętam ich od ręki ... Mam nadzieję, że ktoś może na tym zbudować?
Dave

W Linuksie możesz. jeśli zainstalujesz cygwina, będziesz mógł również w bat
Dani

@Dani, Mike: Cygwin to ogromna zależność i nie jest wymagana do rozwiązania tego problemu. Jeśli już go masz, użyj go - narzędzia wiersza poleceń linux są znacznie lepsze.
Merlyn Morgan-Graham

Odpowiedzi:


141

Oto polecenie, które pomoże Ci zacząć:

FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :8080') DO @ECHO TaskKill.exe /PID %%P

Kiedy masz pewność co do pliku wsadowego, usuń @ECHO.

FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :8080') DO TaskKill.exe /PID %%P

Zwróć uwagę, że może być konieczna nieznaczna zmiana tego dla różnych systemów operacyjnych. Na przykład w systemie Windows 7 możesz potrzebować tokens=5zamiast tokens=4.

Jak to działa

FOR /F ... %variable IN ('command') DO otherCommand %variable...

Umożliwia to wykonywanie commandi zapętlanie danych wyjściowych. Każda linia zostanie upchnięta %variablei może być rozszerzana otherCommandtyle razy, ile chcesz, gdziekolwiek chcesz. %variablew praktyce może mieć tylko nazwę składającą się z jednej litery, np %V.

"tokens=4 delims= "

Pozwala to podzielić każdą linię białymi znakami, pobrać czwartą część w tej linii i włożyć ją do %variable(w naszym przypadku %%P). delimswygląda na pustą, ale ta dodatkowa przestrzeń jest w rzeczywistości znacząca.

netstat -a -n -o

Po prostu uruchom go i dowiedz się. Zgodnie z pomocą wiersza poleceń, to „Wyświetla wszystkie połączenia i nasłuchujące porty.”, „Wyświetla adresy i numery portów w postaci liczbowej.” I „Wyświetla identyfikator procesu będącego właścicielem powiązanego z każdym połączeniem.”. Po prostu skorzystałem z tych opcji, ponieważ ktoś inny to zasugerował, i tak się złożyło;

^|

Pobiera dane wyjściowe pierwszego polecenia lub programu ( netstat) i przekazuje je do drugiego polecenia program ( findstr). Gdybyś używał tego bezpośrednio w linii poleceń, zamiast wewnątrz ciągu poleceń, użyłbyś |zamiast ^|.

findstr :8080

To filtruje wszelkie dane wyjściowe, które są do niego przekazywane, zwracając tylko wiersze zawierające :8080.

TaskKill.exe /PID <value>

To zabija uruchomione zadanie przy użyciu identyfikatora procesu.

%%P instead of %P

Jest to wymagane w plikach wsadowych. Jeśli zrobiłeś to w wierszu polecenia, %Pzamiast tego użyłbyś.


Być może trzeba grać z żetonów delims itp Sprawdź HELP FORw wierszu polecenia, aby zobaczyć wiele innych opcji, które FORdaje i sprawdzić netstat -?, findstr /?i TaskKill /?jeszcze więcej pomocy.
Merlyn Morgan-Graham

Spróbuję tego i wrócę do Ciebie.
Mike Flynn

6
FOR / F "tokens = 5 delims =" %% P IN ('netstat -a -n -o ^ | findstr: 8080') DO TaskKill.exe / F / PID %% P
Mike Flynn

10
To jest świetne. tokens=4to chyba Windows XP i tokens=5Windows 7. Również dobrym pomysłem jest /Fwymuszenie zabicia.
Strelok

1
@ MerlynMorgan-Graham, ponieważ jest to akceptowana odpowiedź, rozważ dodanie punktów ze stackoverflow.com/a/20637662/5243762 również tej odpowiedzi
IAmSurajBobade

196

Otwórz wiersz polecenia i uruchom następujące polecenia

 C:\Users\username>netstat -o -n -a | findstr 0.0:3000
   TCP    0.0.0.0:3000      0.0.0.0:0              LISTENING       3116

C:\Users\username>taskkill /F /PID 3116

, tutaj 3116 to identyfikator procesu


tak, to będzie się różnić wszędzie
Mohit Singh

3
bardzo przydatne ! Pamiętaj, że szukam: 3000 zamiast 0,0: 3000, ponieważ może być poniżej 127.0.01 zamiast 0.0.0.0
Leeeeeeelo

2
Dziękuję, świetna robota, zabijając
wymykające

Lub możesz po prostu podać netstat -ano | findstr: 9797 taskkill / typ PIDeyourPIDhere / F Tutaj 9797 to numer portu, często używam tego polecenia, aby zabić źle działający / zawieszony serwer.
Mohit Singh

53

Aby znaleźć określony proces w wierszu poleceń, użyj poniższego polecenia tutaj 8080 to port używany przez proces

netstat -ano | findstr 8080

aby zabić proces użyj poniższego polecenia tutaj 21424 to identyfikator procesu

taskkill /pid 21424 /F 

@EralpB Enjoy :)
Girdhar Singh Rathore

19

Użycie rozwiązania Merlyn spowodowało śmierć innych aplikacji, takich jak firefox. Te procesy korzystały z tego samego portu, ale nie jako nasłuchiwania:

na przykład:

netstat -a -n -o | findstr :8085
  TCP    0.0.0.0:8085           0.0.0.0:0              LISTENING       6568
  TCP    127.0.0.1:49616        127.0.0.1:8085         TIME_WAIT       0
  TCP    127.0.0.1:49618        127.0.0.1:8085         TIME_WAIT       0

Dlatego można je wykluczyć, dodając „LISTENING” do elementu findstr w następujący sposób:

FOR /F "tokens=5 delims= " %%P IN ('netstat -a -n -o ^| findstr :8085.*LISTENING') DO TaskKill.exe /PID %%P

18

Aby wyświetlić listę wszystkich procesów działających na porcie 8080, wykonaj następujące czynności.

netstat -ano | znajdź „8080”

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       10612

TCP    [::]:8080              [::]:0                 LISTENING       10612

Następnie, aby zabić proces, uruchom następujące polecenie

taskkill / F / PID 10612


13

Dziękuję wszystkim, dodam tylko, że jakiś proces nie zostanie zamknięty, chyba że przełącznik siły / F zostanie również wysłany z TaskKill. Również z przełącznikiem / T wszystkie wątki wtórne procesu zostaną zamknięte.

C:\>FOR /F "tokens=5 delims= " %P IN ('netstat -a -n -o ^|
 findstr :2002') DO TaskKill.exe /PID %P /T /F

W przypadku usług konieczne będzie pobranie nazwy usługi i wykonanie:

sc stop ServiceName


2

Tylko do ukończenia:

Chciałem zabić wszystkie procesy podłączone do określonego portu, ale nie proces nasłuchujący

polecenie (w powłoce cmd) dla portu 9001 to:

FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| findstr -rc:":9001[ ]*ESTA"') DO TaskKill /F /PID %P

findstr :

  • r oznacza wyrażenia, a c oznacza dokładny łańcuch.
  • [] * służy do dopasowywania spacji

netstat :

  • a -> wszystko
  • n -> nie rozwiązuj (szybciej)
  • o -> pid

Działa, ponieważ netstat wypisuje port źródłowy, port docelowy, a następnie ESTABLISHED


2

Utworzono plik bat z poniższą zawartością, akceptuje dane wejściowe dla numeru portu

@ECHO ON
set /p portid=Enter the Port to be killed: 
echo %portid%                                                                              
FOR /F "tokens=5" %%T IN ('netstat -a -n -o ^| findstr %portid% ') DO (
SET /A ProcessId=%%T) &GOTO SkipLine                                                   
:SkipLine                                                                              
echo ProcessId to kill = %ProcessId%
taskkill /f /pid %ProcessId%
PAUSE

Na koniec kliknij „Enter”, aby wyjść.


@TusharPandey To pytanie otagowane w systemie Windows, więc jest to skrypt systemu Windows, a nie skrypt powłoki
Sireesh Yarlagadda

1

Jeśli chcesz zabić proces, który nasłuchuje na porcie 8080, możesz użyć PowerShell. Po prostu połącz polecenie Get-NetTCPConnectioncmdlet z Stop-Process.

Przetestowany i powinien działać z PowerShell 5 na Windows 10 lub Windows Server 2016. Myślę jednak, że powinien działać również na starszych wersjach Windows, które mają zainstalowany PowerShell 5.

Oto przykład:

PS C:\> Stop-Process -Id (Get-NetTCPConnection -LocalPort 8080).OwningProcess

Confirm
Are you sure you want to perform the Stop-Process operation on the following item: MyTestServer(9408)?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"):

0

Podobna do odpowiedzi Merlyna, ale ta obsługuje również te przypadki:

  • Numer portu jest w rzeczywistości lewym podciągiem innego dłuższego numeru portu, którego nie szukasz. Chcesz wyszukać dokładny numer portu, aby nie zabić przypadkowego, niewinnego procesu!
  • Kod skryptu musi działać więcej niż jeden raz i za każdym razem być poprawny, nie pokazując starszych, niepoprawnych odpowiedzi.

Oto ona:

set serverPid=
for /F "tokens=5 delims= " %%P in ('netstat -a -n -o ^| findstr /E :8080 ') do set serverPid=%%P
if not "%serverPid%" == "" (
  taskkill /PID %serverPid%
) else (
  rem echo Server is not running.
)

0

Kroki:

  1. Przejdź do conffolderu na serwerze Apache Tomcat . W moim przypadku jest tak, apache-tomcat-7.0.61\confjak używam apache-tomcat-7.0.61

  2. Otwórz server.xmli zmień numer portu z 8080 na inny, jak chcesz. Na przykład: 8081,8082,8087 itp

  3. Teraz przejdź do binfolderu i uruchomshutdown.bat

  4. Teraz zrestartuj serwer przez eclipse.

Teraz Twój projekt będzie działał bez zakłóceń.


0

Jeśli ktoś szuka skryptu Powershell:

function Search-And-Destroy
{
    param ( [Parameter(Mandatory=$true)][string]$port )
    $lines = netstat -a -o -n | findstr $port
    $ports = @()

    ForEach($line In $lines)
    {
        $res = $($lines -split '\s+')
        $ports += $res[5]
    }

    $ports = $ports | select -uniq

    ForEach($port In $ports)
    {
        echo $(taskkill /F /PID $port)
    }
}

Ta funkcja w zasadzie robi to, co robią powyższe funkcje, ale jest w formacie skryptów Powershell, więc możesz ją dodać do swojego profilu Powershell. Aby znaleźć lokalizację swojego profilu, przejdź do PowerShell i wpiszecho $profile


1
To nie jest tak naprawdę skrypt programu PowerShell, ale netstatnarzędzie otaczające oparte na programie PowerShell .
bahrep

0

Wklej to do wiersza poleceń

FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| find "LISTENING" ^| find ":8080 "') DO (TASKKILL /PID %P)

Jeśli chcesz użyć go w partii, %%Pzamiast%P


Zależy to od języka systemu operacyjnego, czy jest jakiś sposób, aby działał we wszystkich językach?
Jakob

@Jakob Można to uruchomić tylko w terminalu cmd w systemie Windows, również tylko w plikach .cmd lub .bat
Eduard Florinescu

Tak, ale tylko w języku angielskim, w przeciwnym razie „SŁUCHANIE” zostanie przetłumaczone na język systemu operacyjnego.
Jakob

@Jakob Nie wiem, czy netstatnarzędzie jest przetłumaczone na inne języki
Eduard Florinescu

0

jeśli przez system nie możesz zakończyć zadania. spróbuj tego polecenia

x:> net stop http / y


3
Co oznacza „jeśli korzystasz z systemu”? A dlaczego ta odpowiedź jest lepsza od wszystkich innych?
Nico Haase
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.