/엔지니어/트러블슈팅/Address already in use — 포트
트러블슈팅초급UbuntuDebianCentOSRHELmacOS포트Address already in uselsof

Address already in use — 포트 충돌 원인 찾고 해결하기

bind: address already in use 오류가 떴을 때 ss·lsof·fuser 명령어로 포트를 점유한 프로세스를 특정하고, 안전하게 해제하거나 포트를 변경하는 방법.

서버 시작 시 bind: address already in use 또는 EADDRINUSE 오류가 뜨면 해당 포트를 다른 프로세스가 이미 점유 중입니다.


점유 프로세스 찾기

ss (권장 — 대부분 기본 설치)

Bash
# 특정 포트(예: 3000) 점유 확인
sudo ss -tlnp | grep :3000

# 출력 예
# LISTEN 0  511  0.0.0.0:3000  0.0.0.0:*  users:(("node",pid=12345,fd=22))
#                                                        ↑ 프로세스명  ↑ PID
Bash
# 모든 LISTEN 포트 + 프로세스 한번에 보기
sudo ss -tlnp

lsof

Bash
sudo lsof -i :3000

# 출력 예
# COMMAND   PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
# node    12345 deploy   22u  IPv4  123456      0t0  TCP *:3000 (LISTEN)

fuser

Bash
sudo fuser 3000/tcp
# 출력: 3000/tcp:  12345   ← PID

프로세스 확인 후 처리

Bash
# PID로 어떤 프로세스인지 확인
ps -p 12345 -o pid,ppid,user,comm,args

# 실행 경로 확인
ls -la /proc/12345/exe

방법 1: 서비스로 관리 중인 경우

Bash
# 서비스명 확인
sudo systemctl status 12345    # PID로 찾기 어려울 때
# 또는
cat /proc/12345/comm           # 프로세스 이름

# 서비스 재시작
sudo systemctl restart myapp

# 또는 완전 중지 후 재시작
sudo systemctl stop myapp
sudo systemctl start myapp

방법 2: 좀비 프로세스 종료

Bash
# 정상 종료 (SIGTERM)
sudo kill 12345

# 3초 대기 후도 남아있으면 강제 종료
sleep 3 && sudo kill -9 12345

# 특정 이름의 프로세스 전체 종료
sudo pkill -f "node server.js"

방법 3: 포트를 변경 (프로세스를 죽이지 않고)

Bash
# 앱 설정에서 포트 변경 예시 (Node.js)
# PORT=3001 node server.js

# 또는 환경변수 파일 수정
# .env: PORT=3001

# Nginx/Apache 설정 변경
sudo nano /etc/nginx/sites-available/mysite
# listen 3001;  ← 변경 후 reload
sudo nginx -t && sudo systemctl reload nginx

TIME_WAIT 상태로 포트가 점유된 경우

프로세스를 죽였는데도 포트가 열리지 않는 경우입니다.

Bash
# TIME_WAIT 상태 확인
sudo ss -tn | grep TIME-WAIT | grep :3000

# 대기 시간 확인 (기본 60초)
cat /proc/sys/net/ipv4/tcp_fin_timeout

빠른 해결 — SO_REUSEADDR 옵션 사용 (앱 코드에서):

Node.js 예:

JavaScript
server.listen({ port: 3000, host: '0.0.0.0' }, () => {});
// server 옵션에 reuseAddr: true 추가 (net 모듈)

빠른 해결 — 커널 TIME_WAIT 단축:

Bash
# 즉시 적용 (재부팅 후 초기화됨)
sudo sysctl -w net.ipv4.tcp_fin_timeout=15
sudo sysctl -w net.ipv4.tcp_tw_reuse=1

# 영구 적용
echo "net.ipv4.tcp_fin_timeout = 15" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_tw_reuse = 1"     | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

정리

상황명령어
점유 프로세스 찾기`sudo ss -tlnp
PID로 프로세스 확인ps -p PID -o comm,args
정상 종료sudo kill PID
강제 종료sudo kill -9 PID
TIME_WAIT 대기sudo sysctl -w net.ipv4.tcp_fin_timeout=15
#포트#Address already in use#lsof#ss#트러블슈팅#bind#netstat
편집 안내 · Editorial Note

이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.