Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 · 실용 가이드

Linux “Address already in use”: 종료나 재시도 전에 소켓 소유자를 증명하세요

포트 번호만으로는 사건을 설명할 수 없습니다. 프로토콜, 주소 계열, 주소, 포트 또는 경로와 네트워크 네임스페이스를 보존하고 정확한 tuple의 프로세스나 socket unit 소유자를 증명한 뒤 한 소유권 경계만 수정하세요.

요청 socket tuple, 소유자와 충돌 유형 도식
오리지널 일러스트: 실패한 bind를 정확한 소유권 경계에 연결합니다. Watch at Ease

포트 번호만으로는 사건을 설명할 수 없습니다. 프로토콜, 주소 계열, 주소, 포트 또는 경로와 네트워크 네임스페이스를 보존하고 정확한 tuple의 프로세스나 socket unit 소유자를 증명한 뒤 한 소유권 경계만 수정하세요.

EADDRINUSE는 요청 주소의 bind 충돌이며 권한 부족이나 존재하지 않는 로컬 주소와 다릅니다. TCP와 UDP는 별개이며 IPv4와 IPv6 wildcard listener는 설정에 따라 겹칠 수 있습니다.

1. 정확한 bind tuple과 실패 syscall을 보존하세요

TCP, UDP 또는 UNIX socket, IPv4/IPv6, 구체 주소나 wildcard, port/path, process, container, service unit, network namespace를 기록합니다. 변경 전에 EADDRINUSE, EADDRNOTAVAIL, EACCES를 구분하세요.

시작 command, 설정, unit file과 시각을 보존합니다. tuple과 소유권 경계를 알기 전에 runtime을 일괄 종료하거나 UNIX socket path를 지우거나 reuse flag를 켜지 마세요.

2. 올바른 namespace에서 소유자를 확인하세요

bind를 시도한 namespace 안에서 numeric listening과 bound-inactive view를 확인하고 권한이 허용하면 local tuple, state, UID, inode, PID, command를 기록해 시작 타임라인과 비교합니다.

service process와 socket unit을 함께 확인합니다. socket activation에서는 systemd가 합법적으로 listener를 소유합니다. 서비스가 상속 descriptor를 무시하고 다시 bind하면 충돌합니다.

3. wildcard·activation·handoff 충돌을 분류하세요

구체 주소와 wildcard, IPv6 wildcard와 IPv4, TCP와 UDP, UNIX path와 abstract socket을 구분합니다. 같은 숫자만 보고 같은 socket이라고 판단하지 마세요.

임시 socket으로 free port를 찾고 닫은 뒤 나중에 bind하면 check와 use 사이에 다른 process가 선점할 수 있습니다. 실제 bind에서 atomic reservation이나 bounded retry가 필요합니다.

4. 증명된 소유권 경계 하나만 수정하세요

원치 않는 소유자는 실제 supervisor로 중지하고 socket이 닫힌 뒤 시작합니다. socket unit이 의도한 소유자면 서비스가 상속 descriptor를 사용하게 하고 중복 설정은 한 주소와 family로 통일합니다.

SO_REUSEADDR는 문서화된 restart 의미에만 씁니다. SO_REUSEPORT는 모든 listener가 bind 전에 의도적으로 참여하고 동일 UID 경계가 맞는 설계에서만 사용합니다.

5. 재시작으로 안정적 소유권을 증명하세요

staging이나 통제된 시간에 clean start하고 정확한 tuple이 예상 PID/unit과 namespace에 속하는지, health나 protocol response가 정상인지 확인한 뒤 실제 supervisor로 stop/restart합니다.

빠른 재시작과 동시 시작을 한 번씩 시험합니다. 명확한 한 소유자 또는 설계된 reuse group, 간헐적 bind failure 없음, stop 후 orphan listener 없음, rollback 가능을 합격 기준으로 삼습니다.

socket 소유권 관찰·변경·인수 도식
오리지널 일러스트: listener handoff를 수정하고 재시작으로 증명합니다. Watch at Ease