Що в Windows може шукати порт 8080 і спробувати вбити процес, який він використовує, через файл .BAT?
Що в Windows може шукати порт 8080 і спробувати вбити процес, який він використовує, через файл .BAT?
Відповіді:
Ось команда для початку роботи:
FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :8080') DO @ECHO TaskKill.exe /PID %%P
Коли ви впевнені у своєму пакетному файлі, видаліть @ECHO
.
FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :8080') DO TaskKill.exe /PID %%P
Зауважте, що вам може знадобитися трохи змінити це для різних ОС. Наприклад, в Windows 7 вам може знадобитися tokens=5
замість tokens=4
.
Як це працює
FOR /F ... %variable IN ('command') DO otherCommand %variable...
Це дозволяє вам виконувати command
та перетворювати цикл на його вихід. Кожен рядок буде заповнено %variable
і може бути розширений otherCommand
стільки разів, скільки вам заманеться. %variable
у фактичному використанні може мати лише однолітерне ім’я, напр %V
.
"tokens=4 delims= "
Це дозволяє розділити кожен рядок на пробіл і взяти 4-й фрагмент у цьому рядку та заповнити його %variable
(у нашому випадку %%P
). delims
виглядає порожньою, але цей додатковий простір насправді значний.
netstat -a -n -o
Просто запустіть його і дізнайтеся. Відповідно до довідки командного рядка, він "Відображає всі з'єднання та порти прослуховування.", "Відображає адреси та номери портів у числовій формі." Та "Відображає ідентифікатор процесу володіння, пов'язаний із кожним з'єднанням." Я просто використовував ці варіанти, оскільки хтось ще запропонував це, і це трапилось :)
^|
Це приймає вихід першої команди або програми ( netstat
) і передає його другій командній програмі ( findstr
). Якщо ви використовували це безпосередньо в командному рядку, а не всередині командного рядка, ви б використовували |
замість ^|
.
findstr :8080
Це фільтрує будь-який вихід, який передається в нього, повертаючи лише рядки, які містять :8080
.
TaskKill.exe /PID <value>
Це вбиває запущене завдання, використовуючи ідентифікатор процесу.
%%P instead of %P
Це потрібно в пакетних файлах. Якщо ви зробили це в командному рядку, ви б %P
замість цього використали .
HELP FOR
в командному рядку , щоб побачити багато інших варіантів , які FOR
дадуть вам, а також перевірити netstat -?
, findstr /?
і TaskKill /?
для ще більшої допомоги.
tokens=4
це Windows XP, я думаю, і tokens=5
Windows 7. Також гарна ідея /F
змусити вбити.
Відкрийте командний рядок і запустіть наступні команди
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
, тут 3116 - ідентифікатор процесу
Щоб знайти конкретний процес в командному рядку, використовуйте нижче команду, тут 8080 використовується порт
netstat -ano | findstr 8080
для вбивства використання процесу нижче команди тут 21424 - це ідентифікатор процесу
taskkill /pid 21424 /F
Використання рішення Мерлін призвело до вбивства інших програм, як firefox. Ці процеси використовували той самий порт, але не як слухач:
наприклад:
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
Отже, можна виключити їх, додавши "LISTENING" до пошуку, як показано нижче:
FOR /F "tokens=5 delims= " %%P IN ('netstat -a -n -o ^| findstr :8085.*LISTENING') DO TaskKill.exe /PID %%P
Щоб перелічити весь процес, що працює на порту 8080, виконайте наступне.
netstat -ano | знайти "8080"
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 10612
TCP [::]:8080 [::]:0 LISTENING 10612
Потім, щоб вбити процес, запустіть наступну команду
taskkill / F / PID 10612
Дякую всім, просто додамо, що якийсь процес не завершиться, якщо перемикач сили F не надсилається також із TaskKill. Також з перемикачем / T всі вторинні потоки процесу будуть закриті.
C:\>FOR /F "tokens=5 delims= " %P IN ('netstat -a -n -o ^| findstr :2002') DO TaskKill.exe /PID %P /T /F
Для сервісів необхідно отримати назву послуги та виконати:
sc зупинка ServiceName
Тільки для завершення:
Я хотів знищити всі процеси, підключені до певного порту, але не прослуховування процесу
команда (в оболонці cmd) для порту 9001:
FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| findstr -rc:":9001[ ]*ESTA"') DO TaskKill /F /PID %P
findstr :
netstat :
Він працює, тому що netstat роздруковує вихідний порт, потім пункт призначення, а потім ВИСТАВЛЕНО
Створений bat-файл із наведеним нижче вмістом, він приймає вхід для номера порту
@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
Нарешті натисніть "Enter", щоб вийти.
Якщо ви хочете вбити процес, який слухається на порту 8080, ви можете використовувати PowerShell. Просто поєднайте Get-NetTCPConnection
командлет з Stop-Process
.
Випробуваний і повинен працювати з PowerShell 5 на Windows 10 або Windows Server 2016. Однак, я думаю, він також повинен працювати на старих версіях Windows, на яких встановлено PowerShell 5.
Ось приклад:
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"):
Схожа на відповідь Мерлін, але ця також розглядає ці випадки:
Ось:
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.
)
Кроки:
Перейдіть у conf
папку свого сервера apache tomcat . У моєму випадку це apache-tomcat-7.0.61\conf
як я використовую apache-tomcat-7.0.61
Відкрийте server.xml
та змініть номер порту з 8080 на будь-який інший порт за своїм бажанням. Наприклад: 8081,8082,8087 тощо
Тепер перейдіть до bin
папки та запустітьshutdown.bat
Тепер перезавантажте сервер через eclipse.
Тепер ваш проект буде працювати без жодних перерв.
Якщо хтось шукає сценарій 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)
}
}
Ця функція в основному робить те, що роблять вищезгадані функції, але вона знаходиться у форматі сценаріїв Powershell, щоб ви могли додати її до свого профілю Powershell. Щоб знайти місцезнаходження вашого профілю, перейдіть до посилання Shell і введітьecho $profile
netstat
.
Вставте це в командний рядок
FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| find "LISTENING" ^| find ":8080 "') DO (TASKKILL /PID %P)
Якщо ви хочете використовувати його в пакетному пу %%P
замість%P
netstat
інструмент перекладено на інші мови
якщо ви системою не можете закінчити завдання. спробуйте цю команду
x:> net stop http / y