
윈도우 포트 사용 중인 프로세스 확인하고 종료하는 법 — netstat·taskkill 사용법
개발서버를 띄우려는데 '포트가 이미 사용 중'이라는 에러가 뜬다면, netstat -ano 로 점유 프로세스의 PID를 찾아 taskkill /F 로 종료하면 됩니다. CMD와 PowerShell 두 방법, 그리고 흔히 걸려 넘어지는 실수까지 정리했습니다.
포트가 이미 사용 중이라는 빨간 에러를 보고 개발서버가 안 떠서 한참을 헤매신 적 있으시죠? EADDRINUSE, port 8080 is already in use, bind: address already in use — 문구는 제각각이지만 범인은 하나입니다. 누군가가 그 포트를 먼저 붙잡고 놓아주지 않고 있는 거죠.
열에 아홉은 방금 껐다고 생각한 내 서버가 백그라운드에 좀비로 남아 있는 경우입니다. 터미널 창만 닫았지 프로세스는 살아있거나, 디버거가 물고 있거나, 예전에 띄운 도커 컨테이너가 포트를 쥐고 있거나. 원인을 알고 나면 컴퓨터를 재부팅하는 대신 30초 만에 끝납니다. 재부팅은 사실 가장 미련한 해결책이에요 — 멀쩡히 돌던 다른 작업까지 다 날리니까요.

왜 포트가 "이미 사용 중"이 되나
한 포트는 한 프로세스만 들을 수 있습니다. 내 Spring Boot가 8080을 잡고 있는데 또 다른 인스턴스를 띄우면 OS가 거절하는 게 정상이에요. 문제는 "분명히 껐는데도" 에러가 날 때입니다.
이건 프로세스가 완전히 죽지 않았다는 신호입니다. IDE에서 멈춤 버튼을 눌러도 자식 프로세스가 남거나, Ctrl+C가 메인 스레드만 끊고 워커는 살려두는 경우가 흔하죠. 그래서 "껐다"는 내 착각이고, OS 입장에선 포트가 아직 임자가 있는 상태입니다. 범인부터 특정해야 합니다.
1단계 — netstat 으로 범인의 PID 찾기
명령 프롬프트(CMD)를 열고 이렇게 칩니다. :8080 자리에 본인이 쓰려던 포트를 넣으세요.
netstat -ano | findstr :8080
결과는 보통 이렇게 나옵니다.
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 16244
TCP [::]:8080 [::]:0 LISTENING 16244
플래그 의미는 이렇습니다.
-a: 모든 연결과 수신 대기(LISTENING) 포트까지 표시-n: 주소·포트를 숫자 그대로 출력 (DNS 역조회를 건너뛰어 훨씬 빠름)-o: 각 연결을 소유한 프로세스의 PID 표시
맨 오른쪽 숫자가 PID입니다. 위 예시에선 16244. 여러 줄이 나와도 당황하지 마세요 — 우리가 잡을 건 LISTENING 상태인 줄의 PID입니다. findstr 는 대소문자를 구분하니 포트 번호만 정확히 넣으면 됩니다.
2단계 — taskkill 로 종료하기
PID를 알았으면 사실상 끝났습니다.
taskkill /PID 16244 /F
/F 는 강제 종료(force)입니다. 이걸 빼면 "정상 종료해 달라"는 정중한 요청만 보내는데, 포트를 안 놓는 좀비는 그 요청을 무시하기 일쑤라 /F 를 붙이는 게 실전에선 기본입니다. 성공하면 성공: PID 16244인 프로세스가 종료되었습니다 라고 뜨고, 그 포트는 즉시 풀립니다. 이제 다시 서버를 띄우면 됩니다.

PowerShell 이 더 깔끔할 때
CMD의 netstat | findstr 조합이 손에 안 붙는다면 PowerShell이 더 직관적입니다. 먼저 누가 점유 중인지 봅니다.
Get-NetTCPConnection -LocalPort 8080
OwningProcess 컬럼에 찍히는 숫자가 PID입니다. 찾고 죽이는 걸 한 줄로 끝낼 수도 있습니다.
Stop-Process -Id (Get-NetTCPConnection -LocalPort 8080).OwningProcess -Force
죽이기 전에 "이게 대체 무슨 프로그램이지?"가 궁금하면, 이름부터 확인하세요.
Get-Process -Id (Get-NetTCPConnection -LocalPort 8080).OwningProcess
참고로 맥·리눅스라면 훨씬 짧습니다. lsof -i :8080 로 PID를 보고 kill -9 <pid> 로 끝. 원리는 똑같아요 — 포트를 문 프로세스를 찾아서 강제로 내리는 겁니다.
자주 걸려 넘어지는 세 가지
관리자 권한. 액세스가 거부되었습니다(Access is denied) 가 뜨면 열에 아홉은 권한 문제입니다. 시작 메뉴에서 명령 프롬프트나 PowerShell을 "관리자 권한으로 실행"으로 다시 여세요. 특히 80·443 같은 1024 이하 포트는 거의 항상 관리자 권한이 필요합니다.
PID 0과 4는 건드리지 말 것. 결과에 PID 0(System Idle) 이나 4(System) 가 포트를 쥔 걸로 나올 때가 있습니다. 이건 윈도우 커널이나 IIS 호스트 프로세스가 물고 있는 거라 taskkill로 죽이면 안 되고 죽지도 않습니다. 이땐 포트를 바꾸거나 관련 서비스(예: World Wide Web Publishing Service, SQL Server)를 서비스 관리자에서 멈추는 쪽이 맞습니다.
PID와 포트 번호 혼동. netstat 결과에서 왼쪽 주소의 :8080 은 포트고, 맨 오른쪽 숫자가 PID입니다. 이 둘을 바꿔 넣어 엉뚱한 프로세스를 죽이는 실수가 생각보다 잦습니다. taskkill에 넣는 건 언제나 맨 오른쪽 숫자예요.
다시 안 겪으려면
사실 매번 이 작업을 반복하고 있다면, 그건 종료 습관을 손볼 때가 됐다는 뜻입니다. 터미널에서 서버를 돌릴 땐 창을 그냥 닫지 말고 포그라운드에서 Ctrl+C로 정상 종료하는 습관을 들이면 좀비가 눈에 띄게 줄어듭니다. 도커를 쓴다면 docker compose down 으로 내려야 포트가 깨끗이 풀리고, 자주 쓰는 포트 종료 명령은 kill8080 같은 배치 파일이나 PowerShell 함수로 만들어 두면 매번 PID를 찾는 수고도 사라집니다.
한 가지 덧붙이면, 국내 개발 커뮤니티에서도 "포트 안 풀려서 재부팅했다"는 글이 꾸준히 올라옵니다. 그만큼 흔한 일이지만, 재부팅은 증상만 덮을 뿐 원인을 안 알려줘요. 오늘 PID를 직접 찾아본 경험이 쌓이면, 다음엔 에러 문구만 봐도 "아 또 그 녀석이구나" 하고 손이 먼저 움직이게 됩니다. 저는 개인적으로 taskkill보다 PowerShell 한 줄 함수를 등록해 쓰는 쪽을 권합니다 — PID를 눈으로 찾는 단계가 사라지면 실수할 여지도 같이 사라지거든요.
정리하면, netstat으로 PID를 찾고 taskkill로 끊는 두 단계면 포트 충돌은 끝납니다. 재부팅은 최후의 수단이지 첫 수단이 아니에요. 여러분은 포트가 안 풀릴 때 CMD파인가요, PowerShell파인가요? 자주 쓰는 종료 스크립트가 있다면 댓글로 공유해 주세요.
댓글 0
댓글을 불러오는 중…