Убить процесс, посмотрев используемый им порт из.BAT
В Windows что может найти порт 8080 и попытаться убить процесс, который он использует, через файл.BAT?
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
Это требуется в пакетных файлах. Если бы вы сделали это в командной строке, вы бы использовали %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
Поэтому можно исключить их, добавив "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 не будет также отправлен с 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" для выхода.
Посмотрите, какой процесс прослушивает порт: Как узнать, какой процесс прослушивает порт в Windows?
Убить его: Есть ли способ написать файл Windows .bat, чтобы убить процессы?
Просто для завершения:
Я хотел убить все процессы, связанные с конкретным портом, но не процесс прослушивания
команда (в оболочке 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 распечатывает порт источника, затем порт назначения и затем УСТАНАВЛИВАЕТСЯ
Аналогично ответу Мерлина, но этот также обрабатывает следующие случаи:
- Номер порта на самом деле является левой подстрокой другого более длинного номера порта, который вы не ищете. Вы хотите найтиточный номер порта, чтобы не убить случайный, невинный процесс!
- Код сценария должен иметь возможность запускаться более одного раза и быть корректным каждый раз, не показывая старые, неправильные ответы.
Вот:
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.
)
Если вы хотите завершить процесс, прослушивающий порт 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"):
Вставьте это в командную строку
FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| find "LISTENING" ^| find ":8080 "') DO (TASKKILL /PID %P)
Если вы хотите использовать его в партии пу %%P
вместо %P
Если вы по системе, вы не можете закончить задачу. попробуйте эту команду
х:> чистый стоп http /y
Если кто-то ищет скрипт 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
Шаги:
Идти к
conf
папка вашего сервера Apache Tomcat. В моем случае егоapache-tomcat-7.0.61\conf
как я использую apache-tomcat-7.0.61открыто
server.xml
и измените номер порта с 8080 на любой другой порт по вашему желанию. Например:8081,8082,8087 и т. Д.Теперь иди в
bin
папка и запуститьshutdown.bat
Теперь перезапустите сервер через Eclipse.
Теперь ваш проект будет работать без перерыва.