Si un servidor de desarrollo local indica que un puerto ya está en uso, utiliza el comando integrado de macOS lsof para encontrar el proceso que escucha en ese puerto TCP. En Terminal, ejecuta lsof con el número de puerto y un filtro de estado de escucha, y luego usa el PID obtenido para inspeccionar el proceso antes de decidir si detenerlo.

Encontrar el proceso que escucha en un puerto TCP

Abre Terminal y reemplaza 3000 por el puerto que aparece en el mensaje de error. Introduce el comando tal como se muestra; el número es texto sin formato, por lo que no es necesario escapar caracteres de shell.

lsof -nP -iTCP:3000 -sTCP:LISTEN

lsof enumera los archivos abiertos por los procesos, incluidos los sockets de Internet. Aquí, -iTCP:3000 selecciona las conexiones TCP para ese puerto, y -sTCP:LISTEN limita los resultados a los sockets que esperan conexiones. -nP le pide a lsof que muestre direcciones y números de puerto numéricos en lugar de resolver nombres, lo que facilita comparar el resultado con el puerto buscado. Estas opciones están documentadas en el manual de código abierto de macOS lsof de Apple. Manual de macOS lsof de Apple

Un resultado puede verse así; los nombres y números son ilustrativos y no provienen de una Mac en particular:

COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node     8421 sam    21u  IPv6 ...          0t0    TCP *:3000 (LISTEN)

Interpreta COMMAND como el nombre del proceso y PID como su ID de proceso. El campo NAME muestra la dirección local y el puerto. *:3000 indica una dirección comodín (wildcard), mientras que localhost:3000 o una dirección de bucle invertido (loopback) numérica indica una vinculación local. Un socket en escucha comodín puede aceptar conexiones dirigidas a múltiples interfaces locales; esto por sí solo no garantiza que el servicio sea accesible desde Internet. El filtro de escucha es útil porque un proceso también puede tener conexiones de cliente ordinarias en ese mismo puerto.

Comprobar a qué pertenece el PID

Usa el PID obtenido de la salida para solicitar más detalles de la lista de procesos de macOS. Reemplaza 8421 con el PID que encontraste:

ps -p 8421 -o pid=,ppid=,user=,command=

Esto muestra el ID del proceso, el ID del proceso principal, el nombre de la cuenta y la línea de comandos. La línea de comandos puede ayudar a identificar si el socket en escucha pertenece a un servidor de desarrollo, a un entorno de ejecución o a otra aplicación. Un valor corto de COMMAND en lsof no siempre es suficiente para identificar el proyecto o la app que lo inició, por lo que conviene comparar la salida más detallada de ps con la pestaña de Terminal o la aplicación que se espera que posea el servidor.

Si lsof no devuelve ninguna fila, comprueba que el número de puerto sea correcto y que la aplicación siga en ejecución. Es posible que el servidor haya salido, que esté utilizando UDP en lugar de TCP o que aún no haya abierto su socket de escucha. Para inspeccionar sockets UDP en ese puerto, ejecuta:

lsof -nP -iUDP:3000

UDP no utiliza el estado LISTEN de TCP, por lo que no debes añadir -sTCP:LISTEN a esta consulta. Si aparece un resultado, usa sus campos COMMAND y PID como pistas y luego inspecciona ese PID con ps tal como se explicó anteriormente.

Si el comando no muestra ningún resultado o da un error de permisos

Un proceso que se ejecuta bajo otra cuenta puede no ser visible para tu usuario actual. Si recibes un mensaje relacionado con permisos o sospechas que otro usuario es el propietario del socket, vuelve a ejecutar la consulta TCP con privilegios de administrador:

sudo lsof -nP -iTCP:3000 -sTCP:LISTEN

Terminal te pedirá la contraseña de tu cuenta de Mac. Al escribirla, los caracteres generalmente no se mostrarán; presiona Intro cuando termines. Utiliza el acceso de administrador para inspeccionar el resultado e identifica la aplicación propietaria antes de tomar cualquier medida. Si el comando sigue sin mostrar nada, vuelve a intentarlo mientras ocurre el conflicto de puertos: el estado del proceso puede cambiar entre el error y la consulta.

Detener la aplicación adecuada

Encontrar un PID identifica un proceso; no te indica si es seguro finalizarlo. Si reconoces al propietario, detén el servidor usando la aplicación o la sesión de Terminal que lo inició y luego vuelve a intentar tu comando original. Esto le da a la aplicación la oportunidad de cerrarse con normalidad. Si no puedes saber qué inició el proceso, investiga primero la línea de comandos o el PID principal en lugar de finalizar un proceso del sistema o en segundo plano desconocido. lsof informa sobre la propiedad actual del socket; no explica por qué se inició una aplicación o qué configuración del proyecto seleccionó ese puerto.

Para conocer detalles del comando en la versión de macOS instalada, Terminal puede mostrar su manual local con man lsof; presiona q para salir. La guía de Terminal de Apple describe el uso de man para consultar la documentación de los comandos. Primeros pasos con Terminal en la Mac

Fuentes