EADDRINUSE (errno 98)

errno 98

LINUX

Messaggio ufficiale (come appare sullo schermo): Address already in use

Cercato anche come: Address already in use, errno 98, listen EADDRINUSE, address already in use :::3000

Terminale Linux che esegue strace con la chiamata di sistema non riuscita e l'errno evidenziati
errno di Linux: individua la chiamata di sistema che fallisce prima di modificare qualsiasi cosa.

Che cosa significa

EADDRINUSE, «Address already in use» (errno 98 su Linux, 48 su macOS), significa che un programma ha provato a collegarsi a un indirizzo IP e a una porta già occupati da un altro socket. Node.js lo mostra come 'listen EADDRINUSE: address already in use :::3000'. Di solito c'è ancora in esecuzione una vecchia istanza.

Si applica a: Linux, macOS (errno BSD), WSL, Container Docker

Come risolvere EADDRINUSE (errno 98)

  1. Trova il processo che occupa la porta: 'sudo lsof -i :3000' oppure 'sudo ss -ltnp | grep :3000' (Windows: 'netstat -ano | findstr :3000')
  2. Arresta quel processo in modo ordinato, oppure con 'kill <pid>' se è un server di sviluppo rimasto attivo
  3. Cerca servizi duplicati: un'unità systemd, un container Docker ('docker ps') o un processo PM2 potrebbe già eseguire la stessa app
  4. Cambia la porta della tua applicazione se entrambi i servizi devono restare attivi
  5. Dopo un riavvio, imposta SO_REUSEADDR sui socket del server così le connessioni in TIME_WAIT non impediscono il nuovo binding
  6. Se succede nei test, assegna a ogni server di test la porta 0 in modo che il sistema operativo scelga una porta libera

Perché succede

Normalmente un solo socket può collegarsi a una data coppia indirizzo/porta. Il conflitto è causato da server di sviluppo orfani, da una seconda copia del servizio, dai port mapping di Docker e da socket in TIME_WAIT senza SO_REUSEADDR.

Domande frequenti

Come termino il processo sulla porta 3000?

Esegui 'lsof -i :3000' per ottenere il PID, poi 'kill <PID>'. Su Windows usa 'netstat -ano | findstr :3000' e poi 'taskkill /PID <PID> /F'.

Perché la porta risulta in uso se non c'è nulla in esecuzione?

Un'istanza precedente potrebbe essere ancora in fase di arresto o bloccata in TIME_WAIT, oppure un container o un servizio di sistema la sta occupando.

Errori correlati

Fonte: Linux kernel errno.h · soluzioni scritte e verificate dalla redazione (vedi la nostra politica editoriale)

Ultimo aggiornamento: