EADDRINUSE (errno 98)

errno 98

LINUX

Message officiel (tel qu'affiché à l'écran) : Address already in use

Aussi recherché sous la forme : Address already in use, errno 98, listen EADDRINUSE, address already in use :::3000

Terminal Linux exécutant strace, avec l'appel système en échec et l'errno mis en évidence
errno Linux : tracez l'appel système exact qui échoue avant de modifier quoi que ce soit.

Ce que cela signifie

EADDRINUSE, « Address already in use » (errno 98 sous Linux, 48 sous macOS), signifie qu’un programme a tenté de se lier à une adresse IP et un port déjà détenus par un autre socket. Node.js l’affiche sous la forme « listen EADDRINUSE: address already in use :::3000 ». Le plus souvent, une ancienne instance tourne encore.

S'applique à : Linux, macOS (errno BSD), WSL, Conteneurs Docker

Comment corriger EADDRINUSE (errno 98)

  1. Trouvez le processus qui occupe le port : 'sudo lsof -i :3000' ou 'sudo ss -ltnp | grep :3000' (Windows : 'netstat -ano | findstr :3000')
  2. Arrêtez ce processus proprement, ou avec 'kill <pid>' s’il s’agit d’un serveur de développement resté actif
  3. Recherchez des services en double : une unité systemd, un conteneur Docker ('docker ps') ou un processus PM2 exécute peut-être déjà la même application
  4. Changez le port de votre application si les deux services doivent fonctionner
  5. Après un redémarrage, activez SO_REUSEADDR sur les sockets serveur afin que les connexions en TIME_WAIT n’empêchent pas la nouvelle liaison
  6. Si cela se produit dans les tests, donnez le port 0 à chaque serveur de test pour que le système attribue un port libre

Pourquoi cela se produit

Un seul socket peut normalement se lier à une paire adresse/port donnée. Serveurs de développement orphelins, seconde copie du service, redirections de ports Docker et sockets en TIME_WAIT sans SO_REUSEADDR provoquent le conflit.

FAQ

Comment arrêter le processus qui occupe le port 3000 ?

Exécutez 'lsof -i :3000' pour obtenir le PID, puis 'kill <PID>'. Sous Windows, utilisez 'netstat -ano | findstr :3000' puis 'taskkill /PID <PID> /F'.

Pourquoi le port est-il utilisé alors que rien ne tourne ?

Une instance précédente est peut-être encore en cours d’arrêt ou retenue en TIME_WAIT, ou bien un conteneur ou un service système est lié à ce port.

Erreurs liées

Source : Linux kernel errno.h · solutions rédigées et vérifiées par les éditeurs (voir notre politique éditoriale)

Dernière mise à jour :