it-swarm.com.ru

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

В Windows что может найти порт 8080 и попытаться убить процесс, который он использует, через файл .BAT?

117
Mike Flynn

Вот команда, с которой можно начать:

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.

131
Merlyn Morgan-Graham

Откройте командную строку и выполните следующие команды

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

190
Mohit Singh

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

netstat -ano | findstr 8080

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

taskkill /pid 21424 /F 
51
Girdhar Singh Rathore

Использование решения Merlyn привело к уничтожению других приложений, таких как 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
19
Solubris

Чтобы вывести список всех процессов, запущенных на порту 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

16
Sardesh Sharma

Спасибо всем, просто добавьте, что некоторые процессы не будут закрываться, если ключ/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

13
xtrm
3
CharlesB

Просто для завершения:

Я хотел убить все процессы, связанные с конкретным портом, но не процесс прослушивания

команда (в командной консоли 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 распечатывает порт источника, затем порт назначения и затем УСТАНАВЛИВАЕТСЯ

2
Boop

Если вы хотите завершить процесс, прослушивающий порт 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"):
1
bahrep

Если кто-то ищет скрипт 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

0
watzon

Создайте файл 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» для выхода.

0
Sireesh Yarlagadda

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

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

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

0
Eduard Florinescu

Шаги:

  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
Vineetha Swathi

Аналогично ответу Мерлина, но этот также обрабатывает следующие случаи:

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

Вот:

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
Yavin5

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

х:> чистый стоп http/y

0
Nrawut Phrommahit