Вбийте процес, шукаючи порт, який він використовує від .BAT


128

Що в Windows може шукати порт 8080 і спробувати вбити процес, який він використовує, через файл .BAT?


Я можу отримати вас частиною шляху ... з командного рядка скористайтеся командою 'netstat -a -n -o', і ви побачите список процесів і яких портів вони слухають (а також ip і чи вони підключені до іншого IP чи ні ..) Безцінні. Майже напевно будуть приємніші перемикачі для вдосконалення результатів, але я не можу їх запам'ятати без проблем ... Сподіваємось, хтось може на цьому розробити?
Дейв

У Linux можна. якщо ви встановите cygwin, ви зможете провести час у спальні
Дані

@Dani, Mike: Cygwin - це величезна залежність і не потрібен для вирішення цієї проблеми. Якщо ви його вже отримали, скористайтеся ним - інструменти командного рядка Linux набагато краще.
Мерлін Морган-Грехем

Відповіді:


141

Ось команда для початку роботи:

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замість цього використали .


Можливо , вам доведеться грати з жетонами, delims і т.д. Переконайтеся HELP FORв командному рядку , щоб побачити багато інших варіантів , які FORдадуть вам, а також перевірити netstat -?, findstr /?і TaskKill /?для ще більшої допомоги.
Мерлін Морган-Грехем

Я спробую це і повернусь до вас.
Майк Флінн

6
FOR / F "tokens = 5 delims =" %% P IN ('netstat -a -n -o ^ | findstr: 8080') DO TaskKill.exe / F / PID %% P
Майк Флінн

10
Це чудово. tokens=4це Windows XP, я думаю, і tokens=5Windows 7. Також гарна ідея /Fзмусити вбити.
Стрелок

1
@ MerlynMorgan-Graham, оскільки це прийнята відповідь, будь ласка, подумайте про додавання пунктів із stackoverflow.com/a/20637662/5243762 також у цій відповіді
IAmSurajBobade

196

Відкрийте командний рядок і запустіть наступні команди

 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 - ідентифікатор процесу


так, це буде відрізнятися скрізь
Мохіт Сінгх

3
дуже корисний ! Зверніть увагу, я шукаю: 3000 замість 0,0: 3000, бо це могло б під 127,0.01 замість
0,0,0,0

2
Дякую, чудова робота, що вбиває поза контрольним веб-пакетом розробник :)
danjah

Або ви можете просто надати netstat -ano | findstr: 9797 taskkill / PID typeyourPIDhere / F Тут 9797 - номер порту, я часто використовую цю команду для вбивства недоброзичливого / повішеного сервера.
Мохіт Сінгх

53

Щоб знайти конкретний процес в командному рядку, використовуйте нижче команду, тут 8080 використовується порт

netstat -ano | findstr 8080

для вбивства використання процесу нижче команди тут 21424 - це ідентифікатор процесу

taskkill /pid 21424 /F 

@EralpB Насолоджуйтесь :)
Girdhar Singh Rathore

19

Використання рішення Мерлін призвело до вбивства інших програм, як 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

18

Щоб перелічити весь процес, що працює на порту 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


13

Дякую всім, просто додамо, що якийсь процес не завершиться, якщо перемикач сили 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


2

Тільки для завершення:

Я хотів знищити всі процеси, підключені до певного порту, але не прослуховування процесу

команда (в оболонці cmd) для порту 9001:

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

findstr :

  • r - для виразів, а c - точний ланцюг, який повинен відповідати.
  • [] * призначений для відповідних пробілів

netstat :

  • a -> все
  • n -> не вирішити (швидше)
  • o -> pid

Він працює, тому що netstat роздруковує вихідний порт, потім пункт призначення, а потім ВИСТАВЛЕНО


2

Створений 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", щоб вийти.


@TusharPandey Це питання з тегами Windows, тому це скрипт для Windows, а не сценарій оболонки
Sireesh Yarlagadda

1

Якщо ви хочете вбити процес, який слухається на порту 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"):

0

Схожа на відповідь Мерлін, але ця також розглядає ці випадки:

  • Номер порту насправді є лівою підрядкою іншого довшого номера порту, який ви не шукаєте. Ви хочете шукати точний номер порту, щоб не вбити випадковий, невинний процес!
  • Код сценарію повинен мати змогу запускатися не один раз і кожен раз коректувати, не показуючи старіші, неправильні відповіді.

Ось:

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

Кроки:

  1. Перейдіть у confпапку свого сервера apache tomcat . У моєму випадку це apache-tomcat-7.0.61\confяк я використовую apache-tomcat-7.0.61

  2. Відкрийте server.xmlта змініть номер порту з 8080 на будь-який інший порт за своїм бажанням. Наприклад: 8081,8082,8087 тощо

  3. Тепер перейдіть до binпапки та запустітьshutdown.bat

  4. Тепер перезавантажте сервер через eclipse.

Тепер ваш проект буде працювати без жодних перерв.


0

Якщо хтось шукає сценарій 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


1
Це насправді не сценарій PowerShell, а обгортка на основі PowerShell netstat.
bahrep

0

Вставте це в командний рядок

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

Якщо ви хочете використовувати його в пакетному пу %%Pзамість%P


Це залежить від мови ОС, будь-який спосіб змусити її працювати для всіх мов?
Якоб

@Jakob Це можна запустити лише в cmd-терміналі в Windows, також лише у файлах
.cmd

Так, але лише англійською мовою, оскільки в іншому випадку "LISTENING" буде переведено на мову ОС.
Якоб

@Jakob Я не знаю, що netstatінструмент перекладено на інші мови
Едуард Флоринеску

0

якщо ви системою не можете закінчити завдання. спробуйте цю команду

x:> net stop http / y


3
Що означає "якщо ти системою"? І як ця відповідь краща за всі інші?
Ніко Хааз
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.