Watch at EaseHistorias. Respuestas. Perspectiva.

Tecnología · GUÍA PRÁCTICA

Linux dice “Address already in use”: demuestra el dueño del socket antes de matar o reintentar

Un número de puerto no describe el incidente. Conserva protocolo, familia, dirección, puerto o ruta y namespace de red; demuestra qué proceso o unidad socket posee esa tupla; corrige un solo límite de propiedad y repite el arranque.

Diagrama de tupla solicitada, dueño observado y clase de conflicto
Ilustración original: vincula el bind fallido con un límite exacto de propiedad. Watch at Ease

Un número de puerto no describe el incidente. Conserva protocolo, familia, dirección, puerto o ruta y namespace de red; demuestra qué proceso o unidad socket posee esa tupla; corrige un solo límite de propiedad y repite el arranque.

EADDRINUSE informa un conflicto de bind para la dirección solicitada, no falta de permiso ni una dirección local inexistente. TCP y UDP son distintos; los listeners comodín IPv4 e IPv6 pueden solaparse según la configuración.

1. Conserva la tupla bind y la syscall que falla

Registra TCP, UDP o socket UNIX; IPv4 o IPv6; dirección específica o comodín; puerto o ruta; proceso, contenedor, unidad y namespace de red. Distingue EADDRINUSE de EADDRNOTAVAIL y EACCES antes de cambiar nada.

Conserva comando, configuración, unidades y tiempos. No mates todos los procesos de un runtime, borres una ruta UNIX ni actives reutilización antes de conocer la tupla y su límite de propiedad.

2. Inspecciona al dueño en el namespace correcto

Inspecciona dentro del namespace que intentó bind. Usa vistas numéricas listening y bound-inactive; registra tupla local, estado, UID, inode, PID y comando cuando haya permiso, y compáralos con la cronología de servicio y contenedor.

Revisa unidades socket y procesos de servicio. Con activación, systemd puede poseer legítimamente el listener y pasarlo al daemon. Si el servicio ignora el descriptor heredado y vuelve a bind, crea el conflicto.

3. Clasifica conflictos de comodín, activación y relevo

Distingue dirección específica frente a comodín, IPv6 comodín frente a IPv4, TCP frente a UDP y ruta UNIX frente a socket abstracto. El mismo número no implica el mismo socket.

Si una herramienta pide un puerto libre, cierra el socket temporal y hace bind después, otro proceso puede ganar entre comprobación y uso. Hace falta reserva atómica o reintento acotado en el bind real.

4. Corrige un solo límite de propiedad demostrado

Detén al dueño no deseado mediante su supervisor y confirma el cierre. Si la unidad socket es el dueño previsto, consume el descriptor heredado. Si dos listeners configurados se solapan, elige una dirección y familia autoritativas.

Usa SO_REUSEADDR solo para el reinicio documentado. Usa SO_REUSEPORT solo cuando todos los listeners participan antes de bind y el límite de mismo UID es aceptable. No ocultes un dueño desconocido.

5. Repite el arranque y demuestra propiedad estable

En staging o mantenimiento controlado, arranca limpio y demuestra que la tupla pertenece al PID/unidad y namespace esperados. Verifica salud o protocolo y detén y reinicia con el supervisor real.

Prueba reinicio rápido y un lanzamiento concurrente. Exige un dueño documentado o grupo reuse diseñado, ningún fallo intermitente, ningún listener huérfano tras stop y rollback. Si reaparece la carrera, corrige el relevo.

Diagrama de observar, cambiar y aceptar propiedad del socket
Ilustración original: corrige el relevo y demuéstralo al reiniciar. Watch at Ease