웹서버를 로컬에서 실행할때 한번씩 포트번호가 이미 사용되고 있다고 나온다
포트번호 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 |