👑
목차
🎀
반응형
파이썬 웹서버를 띄우다 보면 가끔 일어나는 일인데 제대로 정리된 블로그 글을 찾기 힘들어서
직접 작성했습니다.
상황
로컬에서 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을 시키니 포트가 정상 해제 되었다.
왜 이런일이 생기는가
- netstat이 보여주는 PID는 그 순간의 스냅샷이다.
- 개발 서버(특히 --reload 켠 uvicorn 같은 것)는 부모 프로세스 + 자식 워커 프로세스 구조로 뜨는 경우가 많다.
- 그래서 포트를 잡던 “자식 PID(42424)”가 이미 종료됐거나 바뀌었는데, 내가 그 PID로 죽이려 하면 이미 없는 프로세스라 “찾을 수 없음”이 뜰 수 있다.
- 실제로 서버를 유지하고 다시 워커를 띄우는 “부모 python(22736)”이 남아있으면, 포트 점유가 계속되는 것처럼 느껴진다.
즉, “포트가 안 죽는 게 아니라”내가 죽이려던 PID가 이미 죽었고, 진짜 주범은 다른 PID(부모 python)였던 것.
TIME_WAIT
netstat에 TIME_WAIT가 보이면 포트가 살아있다고 생각할 수 있는데, TIME_WAIT는
서버가 리슨중이라서 점유하는 상태가 아니라
종료된 TCP 연결이 정리되는 과정이라서
보통 기다리면 사라진다.
결론
개발 서버에서 이런 일이 잦다면, 그냥 python 프로세스 목록을 보고 “내가 띄운 서버”의 커맨드라인을 확인한 뒤 종료하는 게 제일 빠르다.
반응형
'Backend · Infra' 카테고리의 다른 글
| 왜 FastAPI는 http로 리다이렉트 될까? Nginx 프록시 환경에서 발생하는 Redirect 문제 (0) | 2025.12.17 |
|---|---|
| Ai가 브라우저 보는 눈👀 : Cursor에서 Browser Tools MCP 사용하는 방법 (윈도우 + WSL) (0) | 2025.10.24 |
| PKCE란? OAuth2 인증을 안전하게 만드는 핵심 보안 메커니즘 (2) | 2025.07.22 |
| Figma 살 돈이없다면? Penpot self-hosting으로 대체하자 (3) | 2025.07.21 |
| MySQL부터 Qdrant 까지 DB 종류 한눈에 보기 (1) | 2025.07.09 |