14 ответов:
вот команда, чтобы вы начали:
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это требуется в пакетных файлах. Если бы вы сделали это в командной строке, вы бы использовали .
Откройте командную строку и выполните следующие команды
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поэтому можно исключить их, добавив "прослушивание" к findstr следующим образом:
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 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
посмотрите, какой процесс прослушивает порт:Как вы можете узнать, какой процесс прослушивает порт на Windows?
убить его: любой способ написать Windows .bat файл, чтобы убить процессы?
только для завершения:
Я хотел убить все процессы, подключенный к определенному порту, но не процесс прослушивания
команда (в оболочке cmd) для порта 9001:
FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| findstr -rc:":9001[ ]*ESTA"') DO TaskKill /F /PID %Pfindstr:
- r для выражений и c для точной цепи, чтобы соответствовать.
- [ ]* для сопоставления пространства
netstat:
- а -> всех
- n - > не разрешайте (быстрее)
- o - > pid
это работает, потому что netstat выводит исходный порт, затем порт назначения, а затем устанавливается
Если вы хотите убить процесс, который прослушивает порт 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. )
действия:
на вашего apache tomcat сервер. В моем случае,его
apache-tomcat-7.0.61\confКак я использую apache-tomcat-7.0.61открыть
server.xmlи измените номер порта с 8080 на любой другой порт по вашему желанию. Например: 8081,8082,8087 etcтеперь переходим к
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. Чтобы найти местоположение вашего профиля, перейдите в powershell и введите
echo $profile
вставить в командную строку
FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| find "LISTENING" ^| find ":8080 "') DO (TASKKILL /PID %P)Если вы хотите использовать его в пакетном pu
%%Pвместо%P
Comments