Se um servidor de desenvolvimento local informar que uma porta já está em uso, use o comando lsof nativo do macOS para encontrar o processo que está escutando nessa porta TCP. No Terminal, execute o lsof com o número da porta e um filtro de estado de escuta, e então use o PID informado para inspecionar o processo antes de decidir se deve encerrá-lo.
Encontre o processo escutando em uma porta TCP
Abra o Terminal e substitua 3000 pela porta indicada na mensagem de erro. Digite o comando conforme mostrado; o número é texto simples, portanto nenhum caractere de escape de shell é necessário.
lsof -nP -iTCP:3000 -sTCP:LISTEN
O lsof lista os arquivos abertos por processos, incluindo sockets de Internet. Aqui, -iTCP:3000 seleciona as conexões TCP para essa porta, e -sTCP:LISTEN restringe os resultados aos sockets que aguardam conexões. O parâmetro -nP solicita que o lsof exiba endereços numéricos e números de porta em vez de resolver nomes, o que facilita a comparação do resultado com a porta pesquisada. Essas opções estão documentadas no manual open-source do lsof do macOS da Apple. Manual do lsof para macOS da Apple
Um resultado pode ser semelhante a este; os nomes e números são ilustrativos, não um relatório de um Mac específico:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 8421 sam 21u IPv6 ... 0t0 TCP *:3000 (LISTEN)
Interprete COMMAND como o nome do processo e PID como o identificador do processo. O campo NAME mostra o endereço local e a porta. *:3000 indica um endereço curinga, enquanto localhost:3000 ou um endereço de loopback numérico indica uma vinculação de loopback. Um ouvinte curinga pode aceitar conexões direcionadas a várias interfaces locais; isso, por si só, não determina que o serviço seja acessível pela Internet. O filtro de escuta é útil porque um processo também pode ter conexões de cliente comuns envolvendo essa mesma porta.
Verifique a que pertence o PID
Use o PID da saída para solicitar mais detalhes da lista de processos do macOS. Substitua 8421 pelo PID que você encontrou:
ps -p 8421 -o pid=,ppid=,user=,command=
Isso exibe o ID do processo, o ID do processo pai, o nome da conta e a linha de comando. A linha de comando pode ajudar a identificar se o listener pertence a um servidor de desenvolvimento, a um runtime ou a outro aplicativo. Um valor curto de COMMAND no lsof nem sempre é suficiente para identificar o projeto ou o aplicativo que o iniciou, portanto, compare a saída mais completa do ps com a aba do Terminal ou o aplicativo que você espera que seja o responsável pelo servidor.
Se o lsof não retornar nenhuma linha, verifique se o número da porta está correto e se o aplicativo ainda está em execução. O servidor pode ter sido encerrado, pode estar usando UDP em vez de TCP ou pode ainda não ter aberto seu socket de escuta. Para inspecionar sockets UDP nessa porta, execute:
lsof -nP -iUDP:3000
O UDP não usa o estado LISTEN do TCP, portanto não adicione -sTCP:LISTEN a esta consulta. Se um resultado for exibido, use seu COMMAND e PID como pistas e, em seguida, inspecione esse PID com o ps como descrito acima.
Se o comando não mostrar resultados ou apresentar erro de permissão
Um processo em execução sob outra conta pode não estar visível para o seu usuário atual. Se você receber uma mensagem relacionada a permissões ou suspeitar que outro usuário é o proprietário do socket, execute novamente a consulta TCP com privilégios de administrador:
sudo lsof -nP -iTCP:3000 -sTCP:LISTEN
O Terminal solicitará a senha da sua conta do Mac. Ao digitá-la, os caracteres normalmente não aparecem; pressione Return ao finalizar. Use o acesso de administrador para inspecionar o resultado e identifique o aplicativo proprietário antes de tomar qualquer medida. Se o comando ainda não mostrar nada, tente novamente enquanto o conflito de porta estiver ocorrendo: o estado do processo pode mudar entre a ocorrência do erro e a consulta.
Encerre o aplicativo correto
Encontrar um PID identifica um processo; isso não indica se é seguro encerrá-lo. Se você reconhecer o proprietário, pare o servidor usando o aplicativo ou a sessão do Terminal que o iniciou e, em seguida, tente novamente o comando original. Isso dá ao aplicativo a chance de encerrar normalmente. Se você não conseguir determinar o que iniciou o processo, investigue a linha de comando ou o PID pai antes de encerrar um processo do sistema ou em segundo plano desconhecido. O lsof informa o proprietário atual do socket; ele não explica por que um aplicativo foi iniciado ou qual configuração de projeto selecionou aquela porta.
Para obter detalhes de comandos na sua versão instalada do macOS, o Terminal pode exibir o manual local com man lsof; pressione q para sair. O guia do Terminal da Apple descreve o uso do man para consultar a documentação de comandos. Primeiros passos no Terminal do Mac
Fontes
Página do manual do lsof para macOS — Apple Open Source
Primeiros passos no Terminal do Mac — Suporte da Apple