Что в 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" к 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
Создан файл 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» для выхода.
На завершение:
Я хотел убить все процессы, подключенные к определенному порту, но не процесс прослушивания
команда (в оболочке cmd) для порта 9001:
FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| findstr -rc:":9001[ ]*ESTA"') DO TaskKill /F /PID %P
findstr :
netstat :
Это работает, потому что netstat распечатывает исходный порт, затем порт назначения, а затем ESTABLISHED
Если вы хотите убить процесс, который прослушивает порт 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. Чтобы узнать местоположение вашего профиля, перейдите в PowerShell и введитеecho $profile
netstat
инструмента на основе PowerShell .
Вставьте это в командную строку
FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| find "LISTENING" ^| find ":8080 "') DO (TASKKILL /PID %P)
Если вы хотите использовать его в пакетном режиме %%P
вместо%P
netstat
инструмент переведен на другие языки
если вы по системе не можете завершить задачу это. попробуйте эту команду
x:> чистая остановка http / y