Puerto en uso en Mac: cómo encontrarlo y solucionarlo
Cualquier error de "puerto en uso" en Mac se reduce a una cosa: otro proceso ocupa el puerto. La solución universal de tres pasos que sirve para el 3000, el 8080, el 5000 o cualquier puerto.
“Puerto en uso”, “address already in use”, EADDRINUSE, “port 3000 is already allocated”: son todos el mismo problema con palabras distintas. Un proceso ya ocupa el puerto que quieres. Este es el único método que soluciona todas sus variantes en un Mac, sin importar el puerto ni el programa.
La causa universal
Solo un programa puede escuchar en un puerto a la vez. Cuando un segundo programa intenta vincularse a un puerto ya ocupado, el sistema operativo lo rechaza, y lo que sea que estés ejecutando traduce ese rechazo a su propio mensaje de error. La redacción cambia; la causa nunca.
Así que la solución siempre son los mismos tres pasos: encuentra qué ocupa el puerto → libéralo o cambia el tuyo → confirma.
Paso 1: Encuentra qué ocupa el puerto
Pon tu número de puerto:
sudo lsof -i :3000 -n -P
COMMAND PID USER ... NODE NAME
node 1421 aaron ... TCP *:3000 (LISTEN)
Esa única línea te dice todo lo que necesitas: el programa (node), su PID (1421) y que está escuchando (LISTEN) en el puerto 3000. Si solo te importa el nombre del proceso, consulta qué app usa un puerto en Mac.
Si lsof no devuelve nada pero aun así obtienes el error, lo más probable es que el puerto esté atascado en TIME_WAIT por una conexión cerrada hace poco; lo explicamos en address already in use.
Paso 2a: Libera el puerto (si es seguro detenerlo)
Si el proceso es un servidor de desarrollo viejo o un script olvidado, termínalo. El comando de una línea:
kill -9 $(lsof -ti :3000)
Prefiere primero un cierre elegante, que permite al proceso limpiar antes de salir:
kill $(lsof -ti :3000)
Recurre a -9 (SIGKILL) solo si el kill elegante (SIGTERM) no funciona. La diferencia importa para cualquier cosa con estado sin guardar; consulta matar un proceso por puerto en Mac.
Paso 2b: O cambia el puerto de tu app (si no lo es)
Cuando no puedes identificar qué ocupa el puerto, o es un servicio del sistema, no lo mates: mueve tu propia app.
# Node
PORT=3001 npm start
# Vite (en vite.config o por CLI)
npm run dev -- --port 5174
# Flask
flask run --port 5001
# Rails
rails server -p 3001
Cambiar tu puerto es la opción más segura por defecto siempre que no tengas claro qué es el otro proceso.
Paso 3: Confirma que funcionó
Vuelve a ejecutar la búsqueda. No debería devolver nada:
lsof -i :3000 -n -P
Un resultado vacío significa que el puerto está libre y tu app arrancará.
Los culpables habituales
La mayoría de los errores de “puerto en uso” se reducen a una lista corta de sospechosos de siempre:
- 3000 → Node, React, Rails (puerto 3000 en uso)
- 5000 → Flask, y AirPlay Receiver en macOS (puerto 5000 en uso)
- 8080 → Tomcat, proxies, segundas apps web (qué es el puerto 8080)
- 5173 → Vite
- 5432 → PostgreSQL
Un detalle propio de macOS: los puertos 5000 y 7000 suelen estar ocupados por AirPlay Receiver, no por un programa que iniciaste tú. Si no encuentras tu proceso en el 5000, normalmente es por eso: desactiva AirPlay Receiver en Configuración del Sistema o simplemente usa otro puerto.
Encuéntralo y soluciónalo sin la terminal
Portie muestra cada puerto abierto en tu Mac y el proceso exacto que ocupa cada uno, en una tabla en vivo actualizada cada 3 segundos. Cuando te topas con “puerto en uso”, ves de un vistazo qué hay en el puerto y lo terminas con un clic, sin lsof ni copiar PIDs.
El monitoreo local es gratuito. El desbloqueo de $8.99 (pago único) agrega la terminación de procesos con un clic (elegante o forzada) y el escaneo remoto de puertos. Descarga Portie y resuelve las colisiones de puertos en segundos.