Backend · Infra

Windows 에서 특정 포트가 안 죽는 것처럼 보일 때 (netstat PID가 죽지 않는 이유)

devhyen 2026. 1. 29. 16:00
👑 목차 🎀
    반응형
    파이썬 웹서버를 띄우다 보면 가끔 일어나는 일인데 제대로 정리된 블로그 글을 찾기 힘들어서
    직접 작성했습니다. 

     

    상황

    로컬에서 API서버 (python fastAPI)을 돌리다가 재실행 하려고 하는데 8000포트가 계속 점유된 것 처럼 보였다. 

    netstat으로 확인하면 분명 LISTENING 이 있는데, taskkill은 "프로세스를 찾을 수 없습니다" 라고 뜨는 상황 

    netstat -abno | findstr /i ":8000"
    TCP  0.0.0.0:8000  0.0.0.0:0  LISTENING  42424
    taskkill /F /T /PID 42424
    오류: 프로세스 "42424"을(를) 찾을 수 없습니다.
    Get-Process -Id 42424
    프로세스를 찾을 수 없습니다.

     

    하지만 해당 8000번 포트는 계속 살아있는 상태이고, 

    서버를 재시동 하기 어려운 상황이었다. 

     

    해결방법

    Get-Process python
    # python PID = 22736
    taskkill /F /T /PID 22736
    성공: PID 22736인 프로세스(PID 42424인 자식 프로세스)가 종료되었습니다.

    파이썬의 pid를 확인해서 

    taskkill을 시키니 포트가 정상 해제 되었다. 

     

    왜 이런일이 생기는가

    1. netstat이 보여주는 PID는 그 순간의 스냅샷이다.
    2. 개발 서버(특히 --reload 켠 uvicorn 같은 것)는 부모 프로세스 + 자식 워커 프로세스 구조로 뜨는 경우가 많다.
    3. 그래서 포트를 잡던 “자식 PID(42424)”가 이미 종료됐거나 바뀌었는데, 내가 그 PID로 죽이려 하면 이미 없는 프로세스라 “찾을 수 없음”이 뜰 수 있다.
    4. 실제로 서버를 유지하고 다시 워커를 띄우는 “부모 python(22736)”이 남아있으면, 포트 점유가 계속되는 것처럼 느껴진다.

    즉, “포트가 안 죽는 게 아니라”내가 죽이려던 PID가 이미 죽었고, 진짜 주범은 다른 PID(부모 python)였던 것.

     

    TIME_WAIT

    netstat에 TIME_WAIT가 보이면 포트가 살아있다고 생각할 수 있는데, TIME_WAIT는 

    서버가 리슨중이라서 점유하는 상태가 아니라 

    종료된 TCP 연결이 정리되는 과정이라서

    보통 기다리면 사라진다. 

     

     

    결론

    개발 서버에서 이런 일이 잦다면, 그냥 python 프로세스 목록을 보고 “내가 띄운 서버”의 커맨드라인을 확인한 뒤 종료하는 게 제일 빠르다.

     

    반응형