.BAT에서 사용중인 포트를 찾아 프로세스 종료


128

Windows에서 포트 8080을 찾고 .BAT 파일을 통해 사용중인 프로세스를 종료하려고 시도 할 수 있습니까?


명령 프롬프트에서 'netstat -a -n -o'명령을 사용하면 프로세스 목록과 프로세스가 수신 대기중인 포트 (IP 및 IP 여부)를 볼 수 있습니다. 그들은 다른 IP에 연결되어 있는지 여부입니다 ..) 귀중합니다. 거의 확실하게 결과를 개선 할 수있는 더 좋은 스위치가있을 것입니다.하지만 기억할 수는 없습니다.
Dave

리눅스에서는 가능합니다. cygwin을 설치하면 박쥐도 할 수 있습니다
Dani

@Dani, Mike : Cygwin은 큰 의존성이며이 문제를 해결하는 데 필요하지 않습니다. 이미 가지고 있다면 리눅스 명령 줄 도구가 훨씬 좋습니다.
Merlyn Morgan-Graham 2016

답변:


141

시작하는 명령은 다음과 같습니다.

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

다른 OS에 대해서는 약간 변경해야 할 수도 있습니다. 예를 들어, Windows 7에서는 tokens=5대신에 필요할 수 있습니다 tokens=4.

작동 원리

FOR /F ... %variable IN ('command') DO otherCommand %variable...

이를 통해을 실행 command하고 출력을 반복 할 수 있습니다 . 각 줄은에 채워 %variable지고 원하는 위치에 원하는 otherCommand만큼 여러 번 확장 할 수 있습니다 . %variable실제로는 단일 문자 이름 만 가질 수 있습니다 (예 :) %V.

"tokens=4 delims= "

이렇게하면 각 줄을 공백으로 나누고 해당 줄의 네 번째 청크를 가져 와서 채워 넣습니다 %variable(이 경우에는 %%P). delims비어있는 것처럼 보이지만 추가 공간이 실제로 중요합니다.

netstat -a -n -o

그냥 실행하고 찾으십시오. 명령 행 도움말에 따르면, "모든 연결 및 청취 포트를 표시합니다.", "주소 및 포트 번호를 숫자 형식으로 표시합니다."및 "각 연결과 연관된 소유 프로세스 ID를 표시합니다." 다른 사람들이 제안했기 때문에 방금이 옵션을 사용했으며 작동했습니다. :)

^|

첫 번째 명령 또는 프로그램 ( netstat) 의 출력을 가져 와서 두 번째 명령 프로그램 ( findstr) 에 전달합니다 . 명령 문자열 대신 명령 줄에서 직접 사용 |하는 경우 대신을 사용 합니다 ^|.

findstr :8080

전달 된 모든 출력을 필터링하여을 포함하는 행만 반환합니다 :8080.

TaskKill.exe /PID <value>

프로세스 ID를 사용하여 실행중인 작업을 종료합니다.

%%P instead of %P

이것은 배치 파일에 필요합니다. 명령 프롬프트에서이 작업을 수행 한 경우 %P대신 사용 합니다.


토큰, delims 등을 가지고 놀아야 할 수도 있습니다 HELP FOR. 커맨드 라인에서 다른 많은 옵션을 FOR확인 netstat -?하고 findstr /?,, 및 TaskKill /?더 많은 도움 을 받을 수있는 옵션을 확인하십시오 .
Merlyn Morgan-Graham 2016

나는 그것을 시도하고 당신에게 돌아올 것입니다.
Mike Flynn 2016 년

6
FOR / F "토큰 = 5 delims ="%% P IN ( 'netstat -a -n -o ^ | findstr : 8080') DO TaskKill.exe / F / PID %% P
Mike Flynn

10
대단하다. tokens=4내가 생각하는 Windows XP와 tokens=5Windows 7입니다. 또한 /F강제로 죽이는 것이 좋습니다 .
Strelok

1
이것이 허용 대답으로 @ MerlynMorgan - 그레이엄에서 포인트를 추가하는 것을 고려하십시오 stackoverflow.com/a/20637662/5243762 뿐만 아니라이 답변
IAmSurajBobade

196

명령 프롬프트를 열고 다음 명령을 실행하십시오.

 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은 프로세스 ID입니다.


네, 그것은 어디에나 다를 것입니다
Mohit Singh

3
굉장히 유용하다 ! 0.0 : 0.0 대신 127.0.01 미만일 수 있으므로 0.0 : 3000 대신 : 3000을 검색하십시오.
Leeeeeeelo

2
감사합니다 :) 제어 웹팩 dev에 작업의 부족 죽이는 훌륭한 일
danjah

또는 단순히 netstat -ano | findstr : 9797 taskkill / PID typeyourPIDhere / F 여기 9797은 포트 번호이며,이 명령을 자주 사용하여 잘못 작동하거나 중단 된 서버를 종료합니다.
Mohit Singh

53

커맨드 라인에서 특정 프로세스를 찾으려면 아래 명령을 사용하십시오 .8080은 프로세스에서 사용하는 포트입니다

netstat -ano | findstr 8080

아래 명령 사용 프로세스를 종료하려면 21424는 프로세스 ID입니다.

taskkill /pid 21424 /F 

@EralpB Enjoy :)
Girdhar Singh Rathore

19

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

따라서 다음과 같이 findlist에 "LISTENING"을 추가하여이를 제외 할 수 있습니다.

FOR /F "tokens=5 delims= " %%P IN ('netstat -a -n -o ^| findstr :8085.*LISTENING') DO TaskKill.exe /PID %%P

18

포트 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


13

/ 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


2

완료를 위해 :

프로세스 수신이 아닌 특정 포트에 연결된 모든 프로세스를 종료하고 싶었습니다.

포트 9001에 대한 명령 (cmd 쉘에서)은 다음과 같습니다.

FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| findstr -rc:":9001[ ]*ESTA"') DO TaskKill /F /PID %P

findstr :

  • r은 표현식에 대한 것이고 c는 정확한 체인에 일치하는 것입니다.
  • [] *는 일치하는 공백을위한 것입니다

netstat :

  • a-> 모두
  • n-> 해결하지 않음 (빠름)
  • o-> pid

netstat가 소스 포트, 대상 포트 및 ESTABLISHED를 인쇄하기 때문에 작동합니다.


2

아래 내용으로 박쥐 파일을 만들면 포트 번호 입력을받습니다.

@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"를 클릭하여 종료하십시오.


@TusharPandey 이것은 윈도우 태그 질문입니다, 그래서 그것은 쉘 스크립트가 아닌 윈도우 스크립트입니다
Sireesh Yarlagadda

1

포트 8080에서 수신 대기중인 프로세스를 종료하려면 PowerShell을 사용할 수 있습니다. Get-NetTCPConnectioncmdlet 을와 결합하면 됩니다 Stop-Process.

Windows 10 또는 Windows Server 2016에서 PowerShell 5를 테스트하여 작동해야합니다. 그러나 PowerShell 5가 설치된 이전 Windows 버전에서도 작동해야한다고 생각합니다.

예를 들면 다음과 같습니다.

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"):

0

Merlyn의 답변과 비슷하지만이 경우도 다음과 같은 경우를 처리합니다.

  • 포트 번호는 실제로 찾고 있지 않은 더 긴 포트 번호의 왼쪽 부분 문자열입니다. 정확한 검색을 원합니다 임의의 순진한 프로세스를 종료하지 않도록 포트 번호 !
  • 스크립트 코드는 오래되고 잘못된 답변을 표시하지 않고 매번 두 번 이상 실행될 수 있고 정확해야합니다.

여기있어:

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

단계 :

  1. Apache Tomcat 서버의 conf폴더로 이동 하십시오 . 제 경우에는 apache-tomcat-7.0.61을 사용하고 있습니다.apache-tomcat-7.0.61\conf

  2. server.xml포트 번호를 열고 8080에서 다른 포트로 변경하십시오. 예를 들면 : 8081,8082,8087 등

  3. 이제 bin폴더 로 이동하여 실행하십시오.shutdown.bat

  4. 이제 일식을 통해 서버를 다시 시작하십시오.

이제 프로젝트가 중단없이 작동합니다.


0

누군가 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


1
이것은 실제로는 PowerShell 스크립트가 아니라 PowerShell 기반 래퍼 netstat도구입니다.
bahrep

0

이것을 명령 행에 붙여 넣기

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

%%P대신 배치 우레탄으로 사용하려는 경우%P


이것은 OS의 언어에 따라 다르며 모든 언어에서 작동하도록 할 수 있습니까?
야콥

@Jakob Windows의 cmd 터미널에서만 .cmd 또는 .bat 파일에서만 실행할 수 있습니다.
Eduard Florinescu

그렇습니다. 그렇지 않으면 "LISTENING"이 OS의 언어로 번역되므로 영어로만 제공됩니다.
야콥

@Jakob 나는 netstat도구가 다른 언어로 번역 되었다는 것을
모른다

0

시스템별로 작업을 종료 할 수 없습니다. 이 명령을 시도

x :> 순 정지 http / y


3
"시스템 별"의 의미는 무엇입니까? 그리고이 답변은 다른 모든 답변보다 어떻게 더 낫습니까?
Nico Haase
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.