Glossario/Quando qualcosa va storto

Porta in ascolto

Anche: porte aperte, cosa usa la porta 3000

In breve

Una porta in ascolto è una porta di rete su cui un processo aspetta connessioni in arrivo, come un server web sulla porta 3000. Solo un processo alla volta può restare in ascolto su una certa porta e indirizzo, ed è per questo che vedi errori come “address already in use”.

I server di sviluppo, i database e alcune app aprono porte in ascolto. Quando avvii un server e fallisce perché la porta è occupata, un altro processo, spesso una copia precedente dello stesso server, è ancora in ascolto lì.

Monitoraggio Attività può mostrare i file e le porte aperti da un processo, ma il modo più rapido per scoprire quale processo occupa una porta è il comando lsof nel Terminale.

Come scoprire cosa usa una porta

Esegui lsof -nP -iTCP:3000 -sTCP:LISTEN nel Terminale, sostituendo 3000 con la tua porta. L’output mostra il nome del comando e il suo PID.

Per elencare tutte le porte TCP in ascolto, esegui lsof -nP -iTCP -sTCP:LISTEN. Aggiungi sudo davanti per includere i processi di altri utenti.

Come liberare una porta

Se il processo è un server che hai avviato tu, fermalo prima nel modo normale, per esempio con Control-C nel terminale in cui gira. Altrimenti esegui kill <PID> con il PID trovato con lsof. Usa kill -9 <PID> solo se non si chiude.

Controlla il nome del processo prima di fermarlo. Alcune porte appartengono a servizi di macOS, come Ricevitore AirPlay, che nelle versioni recenti di macOS è in ascolto sulle porte 5000 e 7000.

Come vedere le porte in Monitoraggio Attività

Fai doppio clic su un processo e apri il pannello Porte e file aperti. Elenca i file e le connessioni di rete che il processo ha aperto.

Come leggere l’output di lsof

Ogni riga è un socket aperto. Un server di solito mostra due righe, una per IPv4 e una per IPv6, con lo stesso PID.

  • COMMAND è il nome del processo, tagliato a 9 caratteri di default. Aggiungi +c 0 per vedere il nome completo: lsof +c 0 -nP -iTCP -sTCP:LISTEN.
  • PID è l’ID del processo da passare a kill o ps.
  • USER è l’account che lo esegue. I processi di root di solito fanno parte di macOS o di un servizio installato.
  • NAME mostra indirizzo e porta. *:3000 significa che il server accetta connessioni su ogni interfaccia di rete. 127.0.0.1:3000 o [::1]:3000 significa che può connettersi solo questo Mac.

Come vedere a quale progetto appartiene un server di sviluppo

Il nome del processo è spesso solo node, python o ruby, che non dice quale progetto è in esecuzione. Due comandi te lo dicono.

  1. Ottieni il PID con lsof -nP -iTCP:3000 -sTCP:LISTEN.
  2. Esegui ps -o pid,ppid,command -p <PID> per vedere il comando completo che l’ha avviato.
  3. Esegui lsof -a -p <PID> -d cwd per vedere la cartella in cui è in esecuzione, che di solito è quella del progetto.
  4. Se il PPID indica una shell, il server è stato avviato da una finestra del terminale. Fermalo lì con Control-C, se quella finestra è ancora aperta.

Perché la porta è occupata quando sembra che non giri niente

Se la porta appartiene a Ricevitore AirPlay, avvia il server su un’altra porta, oppure disattiva Ricevitore AirPlay in Impostazioni di Sistema > Generali, nella sezione AirDrop e Handoff.

  • Un server di una sessione precedente è ancora in esecuzione in una scheda o finestra del terminale che hai dimenticato.
  • Un server è stato avviato in background, o da un editor o da un altro strumento, e non ha una finestra visibile.
  • Il server si è chiuso per errore ma un processo figlio che aveva avviato occupa ancora la porta.
  • Un servizio di macOS usa la stessa porta, come Ricevitore AirPlay sulle porte 5000 e 7000.

La colonna Porte di Monitoraggio Attività non indica le porte di rete

Monitoraggio Attività ha una colonna facoltativa Porte nel pannello CPU. Conta le porte Mach, un meccanismo di messaggi che macOS usa tra i processi, lo stesso valore che top mostra come ports. Non elenca le porte di rete. Per quelle usa lsof o il pannello Porte e file aperti nella finestra di informazioni di un processo.

Domande frequenti

Come vedere cosa usa la porta 3000 sul Mac?

Esegui lsof -nP -iTCP:3000 -sTCP:LISTEN nel Terminale. Mostra il nome e il PID del processo in ascolto su quella porta.

Come terminare il processo che occupa una porta sul Mac?

Trova il suo PID con lsof, poi esegui kill <PID>. Se non si chiude, kill -9 <PID> lo termina subito.

Come elencare tutte le porte aperte sul Mac?

Esegui lsof -nP -iTCP -sTCP:LISTEN per elencare le porte TCP in ascolto. Aggiungi sudo per includere i processi di altri utenti.

Cosa significa “address already in use”?

Un altro processo è già in ascolto su quella porta e indirizzo. Trovalo con lsof -nP -iTCP:<port> -sTCP:LISTEN, poi fermalo o scegli un’altra porta.

Perché lsof non mostra niente per una porta occupata?

Il processo potrebbe appartenere a un altro utente o a root. Esegui lo stesso comando con sudo davanti per includere tutti i processi.

È sicuro terminare quello che occupa la porta 5000 o 7000?

Non senza controllare il nome. Nelle versioni recenti di macOS quelle porte sono spesso usate da Ricevitore AirPlay, che puoi invece disattivare in Impostazioni di Sistema.

Correlati

Passo per passo: Docker usa troppa memoria.

Cerchi qualcosa di meglio di Monitoraggio Attività? Leggi le migliori alternative a Monitoraggio Attività per Mac, oppure sfoglia tutti i termini del glossario.