Убить процесс, найдя используемый им порт в .BAT

128

Что в Windows может искать порт 8080 и пытаться убить используемый им процесс с помощью файла .BAT?

Майк Флинн
источник
Я могу помочь вам в этом ... из командной строки используйте команду netstat -a -n -o, и вы увидите список процессов и какие порты они прослушивают (а также ip и подключены они к другому IP или нет ..) Бесценно. Почти наверняка будут более приятные переключатели для уточнения результатов, но я не могу вспомнить их сразу ... Надеюсь, кто-то сможет развить это?
Дэйв
В Linux вы можете. если вы установите cygwin, вы также сможете использовать летучую мышь
Дэни
@Dani, Майк: 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
Leeeeeeelo
2
Спасибо, отличная работа, убивающая неконтролируемую задачу разработчика webpack :)
danjah
Или вы можете просто указать netstat -ano | findstr: 9797 taskkill / PID typeyourPIDhere / F Здесь 9797 - номер порта, я часто использую эту команду для уничтожения некорректно работающего / зависшего сервера.
Мохит Сингх
53

Чтобы найти конкретный процесс в командной строке, используйте команду ниже, здесь 8080 - это порт, используемый процессом

netstat -ano | findstr 8080

чтобы убить процесс, используйте команду ниже, здесь 21424 - идентификатор процесса

taskkill /pid 21424 /F 
Гирдхар Сингх Ратхор
источник
@EralpB Enjoy :)
Гирдхар Сингх Ратор
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" к findstr следующим образом:

FOR /F "tokens=5 delims= " %%P IN ('netstat -a -n -o ^| findstr :8085.*LISTENING') DO TaskKill.exe /PID %%P
Solubris
источник
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 force не будет отправлен вместе с TaskKill. Также с переключателем / T все вторичные потоки процесса будут закрыты.

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

Для сервисов необходимо будет получить название сервиса и выполнить:

sc stop ServiceName

XTRM
источник
3

Создан файл 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, а не скрипт оболочки
Сириш Ярлагадда
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 :

  • а -> все
  • n -> не разрешать (быстрее)
  • o -> pid

Это работает, потому что netstat распечатывает исходный порт, затем порт назначения, а затем ESTABLISHED

Boop
источник
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"):
bahrep
источник
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.
)
Yavin5
источник
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. Чтобы узнать местоположение вашего профиля, перейдите в PowerShell и введитеecho $profile

watzon
источник
1
На самом деле это не сценарий PowerShell, а оболочка netstatинструмента на основе PowerShell .
bahrep 02
0

Вставьте это в командную строку

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

Если вы хотите использовать его в пакетном режиме %%Pвместо%P

Эдуард Флоринеску
источник
Это зависит от языка ОС, есть ли способ заставить его работать для всех языков?
Якоб
@Jakob Это можно запустить только в терминале cmd в Windows, также только в файлах .cmd или .bat
Эдуард Флоринеску,
Да, но только на английском языке, иначе «ПРОСЛУШИВАНИЕ» будет переведено на язык ОС.
Якоб
@Jakob Я не знаю, что netstat инструмент переведен на другие языки
Эдуард Флоринеску
0

если вы по системе не можете завершить задачу это. попробуйте эту команду

x:> чистая остановка http / y

Нравут Пхроммахит
источник
3
Что значит «если вы по системе»? И чем этот ответ лучше всех остальных?
Нико Хаасе