Alex Sarmiento
ES / EN

El error Error: Address already in use es el pan de cada día del administrador de sistemas. Ocurre cuando intentas levantar un contenedor Docker o un servicio web y el puerto ya está ocupado por un proceso fantasma.

En este post aprenderás a identificar al culpable y a terminarlo de forma segura (y forzosa si es necesario).

1. Auditoría de Puertos

Antes de tocar nada, necesitas visibilidad. ¿Qué puertas tiene abiertas tu servidor hacia el mundo?

1.1 El estándar moderno: ss

Olvida el comando obsoleto netstat. La herramienta estándar hoy en día es ss (Socket Statistics). Es más rápida y ofrece más información.

# Banderas esenciales:
# -t: TCP
# -u: UDP
# -l: Listening (solo los que están escuchando)
# -n: Numeric (muestra puertos por número, no por nombre de servicio)
# -p: Process (muestra qué proceso usa el puerto, requiere sudo)

sudo ss -tulnp
Verás una lista limpia. Fíjate en la columna Local Address:Port.

1.2 El francotirador: lsof

Si ya sabes qué puerto te da problemas (ej. 8080), no busques en toda la lista. Usa lsof (List Open Files) para ir directo al grano.


# Sintaxis: lsof -i :PUERTO
sudo lsof -i :8080
El resultado es crítico para el siguiente paso:

Plaintext

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python3   12345 root   3u   IPv4 998877      0t0  TCP *:8080 (LISTEN)
COMMAND: Es un script de Python.

PID (Process ID): 12345. Anota este número.

2. Investigación de Procesos

Ahora que tienes el PID (12345) o el nombre, vamos a ver qué está haciendo ese proceso realmente.

2.1 La radiografía: ps

El comando ps te da la instantánea actual del sistema. Combínalo con grep para filtrar.


# aux: muestra todos los procesos de todos los usuarios
# grep: filtra por nombre o PID
ps aux | grep 12345
Esto te mostrará la ruta exacta del ejecutable y los argumentos con los que se lanzó. Vital para saber si es un proceso crítico del sistema o algo que dejaste olvidado.

2.2 Monitorización en tiempo real: htop

Si el servidor va lento, necesitas ver el consumo de CPU/RAM en vivo. htop es la mejor herramienta visual para esto.


# Instalación (si no lo tienes)
sudo apt install -y htop

# Ejecución
htop
Usa F6 para ordenar por consumo de RAM o CPU.

Usa F4 para filtrar por nombre de proceso.

3. Terminación de Procesos (Kill)

Una vez identificado el proceso que estorba, hay que detenerlo. En Linux, esto se hace enviando “señales”.

3.1 La forma educada (SIGTERM -15)

Siempre intenta esto primero. Le pide al programa que guarde datos, cierre conexiones y se apague limpiamente.


# kill -15 es el valor por defecto, no hace falta escribirlo
kill 12345

3.2 La forma agresiva (SIGKILL -9)

Si el proceso está bloqueado o ignora la petición anterior, usa el -9. Esto corta la ejecución inmediatamente. Advertencia: Puede causar corrupción de datos si el proceso estaba escribiendo en disco.


kill -9 12345

3.3 Matar por nombre

Si tienes 10 procesos de nginx bloqueados, matarlos uno a uno por PID es lento.


# Mata TODOS los procesos con este nombre
sudo killall nginx

4. Diferencia entre Procesos y Servicios

IMPORTANTE: Si matas un proceso con kill y vuelve a aparecer inmediatamente con un PID diferente, probablemente es un Servicio del Sistema (systemd) o un contenedor Docker con política de reinicio.

En ese caso, kill no sirve. Debes parar el servicio:


# Verificar estado
sudo systemctl status nginx

# Detener correctamente
sudo systemctl stop nginx

# Reiniciar (Stop + Start)
sudo systemctl restart nginx

Siempre verifica si lo que intentas matar es un servicio gestionado antes de usar kill -9.