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



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

655   14  

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

только для завершения:

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

команда (в оболочке 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 выводит исходный порт, затем порт назначения, а затем устанавливается

Если вы хотите убить процесс, который прослушивает порт 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.
)

действия:

  1. на вашего apache tomcat сервер. В моем случае,его apache-tomcat-7.0.61\conf Как я использую apache-tomcat-7.0.61

  2. открыть server.xml и измените номер порта с 8080 на любой другой порт по вашему желанию. Например: 8081,8082,8087 etc

  3. теперь переходим к bin папка и запустить shutdown.bat

  4. теперь перезапустите сервер через 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

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

x:> net stop http / y

Comments

    Ничего не найдено.