W systemie Windows, co może szukać portu 8080 i próbować zabić proces, którego używa, za pomocą pliku .BAT?
W systemie Windows, co może szukać portu 8080 i próbować zabić proces, którego używa, za pomocą pliku .BAT?
Odpowiedzi:
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=5
zamiast tokens=4
.
Jak to działa
FOR /F ... %variable IN ('command') DO otherCommand %variable...
Umożliwia to wykonywanie command
i zapętlanie danych wyjściowych. Każda linia zostanie upchnięta %variable
i może być rozszerzana otherCommand
tyle razy, ile chcesz, gdziekolwiek chcesz. %variable
w 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
). delims
wyglą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, %P
zamiast tego użyłbyś.
HELP FOR
w wierszu polecenia, aby zobaczyć wiele innych opcji, które FOR
daje i sprawdzić netstat -?
, findstr /?
i TaskKill /?
jeszcze więcej pomocy.
tokens=4
to chyba Windows XP i tokens=5
Windows 7. Również dobrym pomysłem jest /F
wymuszenie zabicia.
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
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
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
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
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
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 :
netstat :
Działa, ponieważ netstat wypisuje port źródłowy, port docelowy, a następnie ESTABLISHED
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ść.
Jeśli chcesz zabić proces, który nasłuchuje na porcie 8080, możesz użyć PowerShell. Po prostu połącz polecenie Get-NetTCPConnection
cmdlet 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"):
Podobna do odpowiedzi Merlyna, ale ta obsługuje również te przypadki:
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.
)
Kroki:
Przejdź do conf
folderu na serwerze Apache Tomcat . W moim przypadku jest tak, apache-tomcat-7.0.61\conf
jak używam apache-tomcat-7.0.61
Otwórz server.xml
i zmień numer portu z 8080 na inny, jak chcesz. Na przykład: 8081,8082,8087 itp
Teraz przejdź do bin
folderu i uruchomshutdown.bat
Teraz zrestartuj serwer przez eclipse.
Teraz Twój projekt będzie działał bez zakłóceń.
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
netstat
narzędzie otaczające oparte na programie PowerShell .
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, %%P
zamiast%P
netstat
narzędzie jest przetłumaczone na inne języki
jeśli przez system nie możesz zakończyć zadania. spróbuj tego polecenia
x:> net stop http / y