Port already in use (EADDRINUSE) – Prozess finden & beenden
Server startet nicht wegen EADDRINUSE / 'address already in use'? So findest du den blockierenden Prozess und gibst den Port frei.
Aufwand:
ca. 5 Min.
Voraussetzung:
sudo-Rechte, Terminal
Das Symptom
Du startest deinen Entwicklungsserver und statt „listening on :3000“ wirft die
Konsole dir Error: listen EADDRINUSE: address already in use :::3000
entgegen. Der Prozess bricht sofort ab. Du startest erneut – gleiches Ergebnis.
Der Port ist besetzt, obwohl du dir sicher bist, alles geschlossen zu haben.
Die „Layer 8“-Wahrheit
Ein Netzwerkport kann immer nur von einem Prozess belegt sein – das ist kein
Fehler, sondern eine Grundregel. EADDRINUSE heißt also unbestechlich: Da läuft
schon jemand. In der Entwicklungspraxis ist dieser „jemand“ fast immer eine
frühere Instanz derselben App, die nach einem Absturz oder einem
weggeklickten Terminal im Hintergrund weiterlebt, den Port festhält und dabei
unsichtbar bleibt. Kurz: Man kämpft gegen sein eigenes Geistergespenst von vor
fünf Minuten. Ein Blick mit lsof verrät die PID – und ein gezieltes kill
beendet den Spuk schneller als der zehnte Neustartversuch.
Die echte, verifizierte Lösung
1000 % faktenbasiert. Jeder Befehl ist real, jeder Pfad existiert. Schritt für Schritt:
1.
Den blockierenden Prozess identifizieren
Herausfinden, welche Prozess-ID (PID) den Port belegt – je nach Betriebssystem:
sudo lsof -i :3000 # Linux/macOS
ss -tlnp | grep :3000 # Linux (Alternative)
netstat -ano | findstr :3000 # Windows
2.
Den Prozess gezielt beenden
Mit der ermittelten PID den Prozess beenden. Erst normal (SIGTERM), nur im Notfall hart (-9):
Statt den Blocker zu beenden, kann die Anwendung auf einen freien Port ausweichen – bei vielen Node-Tools über eine Umgebungsvariable:
PORT=3001 npm run dev
4.
Verwaiste Node-/Dev-Prozesse aufräumen
Nach Abstürzen bleiben oft Zombie-Prozesse zurück, die den Port halten. Gezielt die betroffenen Prozesse beenden (Vorsicht: pkill trifft alle passenden):
pkill -f "node .*dev"
5.
Prüfen, ob ein Dienst den Port dauerhaft belegt
Manchmal ist es kein Zombie, sondern ein echter Dienst (z. B. eine lokale Datenbank oder ein anderer Webserver), der den Port regulär nutzt. Dann diesen Dienst umkonfigurieren statt ihn ständig zu killen.
Häufige Fragen (FAQ)
?Was bedeutet der Fehler EADDRINUSE?
'Error: address already in use' – der Port, an den sich dein Programm binden möchte (z. B. 3000), wird bereits von einem anderen Prozess belegt. Oft ist es eine frühere, nicht sauber beendete Instanz derselben Anwendung.
?Wie finde ich heraus, welcher Prozess einen Port blockiert?
Linux/macOS: 'sudo lsof -i :3000' oder 'ss -tlnp | grep :3000'. Windows: 'netstat -ano | findstr :3000' zeigt die PID, die du dann gezielt beenden kannst.
Belege
Diese Seite ist gegen die folgenden Primärquellen geprüft – Hersteller, Standard oder Gesetzestext. Wer es nicht glaubt, muss es nicht: Da steht, wo es nachzulesen ist.
npm install -g bricht mit 'EACCES: permission denied' ab? Nicht sudo verwenden. So installierst du globale Pakete korrekt über nvm oder ein eigenes Prefix.
Docker bricht mit 'no space left on device' ab, obwohl scheinbar Platz da ist? Alte Images, Container und Build-Cache fressen die Platte. So räumst du auf.