프로젝트

[윈도우 스크립트] 포트번호로 프로세스 종료하기

NickTop 2023. 10. 23. 23:05

웹서버를 로컬에서 실행할때 한번씩 포트번호가 이미 사용되고 있다고 나온다

포트번호 8080 및 8081 종료하는 스크립트이다

.bat으로 저장한 뒤 실행한다

@echo off
setlocal enabledelayedexpansion

for %%p in (8080 8081) do (
    set "port=%%p"
    set "portFound="
    for /f "tokens=3,5" %%a in ('netstat -aon ^| findstr "0.0.0.0:!port!"') do (
        set "address=%%a"
        set "pid=%%b"
        if "!address!"=="0.0.0.0:0" (
            set "portFound=1"
            echo Killing process with PID: !pid! using port !port!...
            taskkill /F /PID !pid!
        )
    )
    if not defined portFound (
        echo Port !port! is not running
    )
)

endlocal
pause

 

@echo off

명령어 출력안하고 명령의 결과만 출력함

 

setlocal - endlocal

해당 구문 내에서 set으로 선언된 변수는 로컬 변수임

 

enabledelayedexpansion

address 및 pid는 상수가 아닌 변수로 프로그램이 실행되는 동안 변경된다

set=변수  /  !변수! 조합으로 변수를 불러 올 수 있다

enabledelayedexpansion 는 !변수!를 사용할 수 있게 한다

변수가 아니라 한번만 지정되고 다시 지정되지 않는다면 enabledelayedexpansion는 필요없고

set=상수  /  %상수%! 조합으로 상수를 불러 올 수 있다

 

echo

파이썬의 print와 똑같음

 

('netstat -aon ^| findstr "0.0.0.0:!port!"')

netstat -aon 실행 후 0.0.0.0:!port! 가 포함된 줄을 찾아 return

^가 없으면 |를 |로 인식하지 못함

 

for /f "tokens=3,5" %%a in (~~)

in의 값을 split하여 3번째 5번째 값을 가져와 %%a 및 %%b에 저장함

(%%b는 for에서 선언하지 않아도 %%a 다음 문자로 자동 지정됨)

 

다음은 netstat -aon의 결과 중 일부이다

프로토콜  로컬 주소              외부 주소              상태            PID
TCP    0.0.0.0:8080            0.0.0.0:0              LISTENING       1234

tokens는 공백을 기준으로 split한다 (쉼표나 콜론으로 split하려면 delims 사용)

3,5로 지정했으므로, 외부주소컬럼인 0.0.0.0:0과 pid컬럼인 1234이 각각 %%a 및 %%b에 들어간다

 

taskkill /F /PID !pid!

pid를 기준으로 프로세스 종료

 

pause

프로세스가 종료되더라도 스크립트 결과 창이 닫히지 않는다

 

실행결과

Killing process with PID: 1234 using port 8080...
성공: 프로세스(PID 9120)가 종료되었습니다.
Port 8081 is not running
계속하려면 아무 키나 누르십시오 . . .

'프로젝트' 카테고리의 다른 글

MediaSoup, SFU  (1) 2024.02.09
Ngrok  (0) 2023.12.24
[Linux][Gradle] springboot 빌드 및 실행  (0) 2023.08.13
GDB  (0) 2023.05.07
vscode python c module print 하기  (0) 2023.04.24