So lösen Sie localhost von Error: Listen Sie EADDRINUSE


120

Ich teste einen Server, der in NodeJS unter Windows 7 geschrieben ist, und wenn ich versuche, den Tester in der Befehlszeile auszuführen, erhalte ich den folgenden Fehler

Error: listen EADDRINUSE
at errnoException (net.js:614:11)
at Array.0 (net.js:704:26)
at EventEmitter._tickCallback (node.js:192:40)

Wie kann ich das Problem beheben, ohne es neu zu starten?


9
sudo killall nodekann nützlich sein
Hashir Hussain

Antworten:


101

Dies bedeutet, dass die Adresse verwendet wird, an die Sie den Server binden möchten. Versuchen Sie es mit einem anderen Port oder schließen Sie das Programm über diesen Port.


Ich konnte mit Port 3000 nichts finden, aber das Ändern hat funktioniert!
Dennis

7
Da dieses Einzelknotenprogramm das einzige ist, das Port 3000 auf meinem Computer verwendet, scheint es ziemlich klar zu sein, dass etwas passiert ist, das verhindert, dass die vorherige Instanziierung meines Knotenprozesses ordnungsgemäß heruntergefahren wird. Es hat funktioniert, als ich node app.jses mit Strg + C verwendet und gestoppt habe, aber nach dem ersten Mal trat das EADDRINUSE-Problem auf. npm startEs scheint also die wirkliche Lösung zu sein, etwas anderes als Strg + C zu verwenden, um es nach der Verwendung herunterzufahren npm start.
David Mason

Ihr npm startSkript kann mehr als ein Knotenprogramm oder ein Knotenprogramm sein, das im Hintergrund ausgeführt wird, oder das Programm verfügt möglicherweise über untergeordnete Prozesse, die diesen Port verwenden.
Fent

1
Sehr oft tritt dieser Fehler auf, weil ein Knotenprozess nicht beendet wurde. Aber manchmal wird der Port von anderen Prozessen verwendet, und daher kann es schwierig sein, den richtigen Prozess zu verstehen / zu lokalisieren, der ihn blockiert. WolfReporter unten hat eine korrekte Lösung für dieses Problem! stackoverflow.com/a/22875192/36975
qualbeen

6
Ich habe ps aux | grep nodedie Prozess-ID gefunden (zweite Spalte) und sie einfach mit getötet kill <pid>(meine war kill 18762).
Nik_m

168

Lauf:

ps -ax | grep node

Sie erhalten so etwas wie:

60778 ??         0:00.62 /usr/local/bin/node abc.js

Dann mach:

kill -9 60778

Vielen Dank! Funktioniert auf meiner Maschine!
Olefrank

Vielen Dank. Das war was ich brauchte. Ich hatte pm2 installiert, das die Node-App automatisch startet, wenn sie geschlossen ist. Ich musste pm2 deaktivieren, um den Knoten automatisch zu starten.
KlevisGjN

Funktioniert! Vielen Dank
Wim den Herder

9
Wie macht man das unter Windows?
William

kill -15 60778wäre viel besser, da der Prozess SIGTERMstattdessen SIGKILL
ordnungsgemäß beendet werden könnte

39

Unter Linux (mindestens Ubuntu-Derivate)

killall node

ist einfacher als diese Form.

ps | grep <something>
kill <somepid>

Beides funktioniert nicht, wenn ein verwaistes Kind den Hafen hält. Tun Sie stattdessen Folgendes:

netstat -punta | grep <port>

Wenn der Port gehalten wird, sehen Sie ungefähr Folgendes:

tcp           0      0.0.0.0:<port>          0.0.0.*       LISTEN     <pid>/<parent>

Jetzt töte durch pid:

kill -9 <pid>

1
Dies sollte als vollständige Antwort markiert werden. Denn auch in meinem Fall war es ein verwaistes Kind. Nennen sie das einen Zombie-Prozess?
Nithish Inpursuit Ofhappiness

1
Anstelle der erwarteten <pid>/<parent>bekomme ich-
Francisco Corrales Morales

35

Mit dem folgenden Befehl erhalten Sie eine Liste der ausgeführten Knotenprozesse.

ps | grep node

Beenden Sie den Vorgang wie folgt, um diesen Port freizugeben.

kill <processId>

3
Möglicherweise möchten Sie ein hinzufügen | grep -v grep, um den grepProzess auszuschließen .
Garrett Hyde

6
Wie das Originalplakat schrieb: "unter Windows 7" ... ;-)
Golo Roden

4
Eine viel bessere Alternative wärepidof node
Itay Grudev

pidofwar einfach für mich auf osx mit homebrew installiertbrew install pidof
electblake

1
Wenn Sie mehr als nur Knotenanwendungen ausführen, ist die Adresse möglicherweise an eine andere Anwendung gebunden. Wäre es nicht besser, nach der PID zu suchen, die an den Port gebunden ist, an dem Sie starten möchten? dh: für linux könnte man netstat -lnptu | verwenden grep port #. Ich bin mir nicht sicher, was das Äquivalent für Windows ist.
chrisst

31

Sie erhalten den Fehler, EADDRINUSEweil der Port, den Ihre Anwendung verwenden möchte, von einem anderen Prozess belegt wird. Um diesen Port freizugeben, müssen Sie den Belegungsprozess beenden.

Da Sie unter Windows arbeiten , können Sie den Vorgang über die Eingabeaufforderung ( cmd) beenden . Mit dem können cmdSie die Prozess-ID (PID) der blockierenden Anwendung ermitteln. Sie benötigen die PID, um den Prozess zu beenden / abzubrechen.

Hier ist eine Schritt-für-Schritt-Anleitung ...

  1. Suchen Sie alle Prozesse, die auf einem angegebenen Port ausgeführt werden (in diesem Beispiel ist Port "3000"):

    netstat -ano | find ": 3000"

  2. Der netstatBefehl listet alle Prozesse auf, die am angegebenen Port ausgeführt werden. In der letzten Spalte der netstatErgebnisse sehen Sie das PIDs (in diesem Beispiel ist die PID "8308"). Weitere Informationen zu einem bestimmten PIDBefehl erhalten Sie, indem Sie den folgenden Befehl ausführen :

    tasklist / fi "pid eq 8308"

  3. Wenn Sie einen Prozess beenden möchten, können Sie dies mit dem folgenden Befehl tun, indem Sie dessen verwenden PID(in diesem Beispiel lautet die PID "8308"):

    taskkill / pid 8308 / f

Bildschirmfoto

Geben Sie hier die Bildbeschreibung ein


1
solide Erklärung.
Joe Healy

19

Wenn Sie eine Fehlermeldung erhalten Fehler: Hören Sie EADDRINUSE,

Versuchen Sie, die folgenden Shell-Befehle auszuführen:

netstat -a -o | grep 8080
taskkill /F /PID 6204

Ich habe grepfür 8080 gearbeitet, weil ich weiß, dass mein Server auf Port 8080 ausgeführt wird. ( staticSagt mir beim Starten: "Serving". "Unter http://127.0.0.1:8080 '.) Möglicherweise müssen Sie nach einem anderen suchen Hafen.


1
Zu guter Letzt! Eine Antwort, die nach Port und nicht nach Prozess sucht. Es ist nicht nur ein Knoten, der einen Port binden kann!
Michael Scheper

Ich habe ein Modul namens porthog erstellt, um festzustellen, welcher laufende Prozess einen Port sperrt . Grundsätzlich wird der obige Code ausgeführt.
Corey

15

Angenommen, Ihr Server läuft weiter port 3000

lsof -i tcp:3000
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    node    11716 arun   11u  IPv6 159175      0t0  TCP *:3000 (LISTEN)

nach diesem Gebrauch kill -9 <pid>

im obigen Fall sudo kill -9 11716


12

Verwenden Sie den folgenden Befehl, um einen Prozess zu beenden, der an einem bestimmten Port ausgeführt wird - 3000 in diesem Beispiel unten

kill -9 $(lsof -t -i:3000)

7

Eine mögliche Lösung, die für mich funktionierte, bestand darin, einfach das Fenster im Browser zu schließen, in dem das entsprechende Skript " http: // localhost: 3000 / " ausgeführt wurde.


Ja, das noch geöffnete Browserfenster ist ein häufiges Problem mit localhost-Ports :-)
Dave Everitt

7

Überprüfen Sie die Prozess-ID

sudo lsof -i: 8081

Dann töte den bestimmten Prozess

Sudo töten -9 2925

Geben Sie hier die Bildbeschreibung ein


6

Wenn Sie eine Fehlermeldung erhalten

Fehler: EADDRINUSE anhören

Öffnen Sie die Eingabeaufforderung und geben Sie die folgenden Anweisungen ein:

netstat -a -o | grep 8080
taskkill /F /PID** <*ur Process ID no*>

Starten Sie danach die Telefonlückenschnittstelle neu.

Wenn Sie wissen möchten, welche Prozess-ID phonegap verwendet, öffnen Sie TASK MANAGER, sehen Sie sich die Spaltenüberschrift PID an und suchen Sie die PID-Nr.


Ich konnte den Taskkill nicht zum Laufen bringen, also öffnete ich den Task-Manager und fügte die PID hinzu und tötete sie dort
Tom Stickel

5

Der oben erwähnte killall -9Knoten, der von Patrick vorgeschlagen wurde, funktioniert wie erwartet und löst das Problem. Möglicherweise möchten Sie jedoch den Bearbeitungsteil dieser Antwort lesen, um herauszufinden, warumkill -9 möglicherweise nicht der beste Weg ist.

Darüber hinaus möchten Sie möglicherweise auf einen einzelnen Prozess abzielen, anstatt alle aktiven Prozesse blind zu beenden.

In diesem Fall rufen Sie zuerst die Prozess-ID (PID) des Prozesses ab, der an diesem Port ausgeführt wird (z. B. 8888):

lsof -i tcp:8888

Dies wird ungefähr Folgendes zurückgeben:

COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node     57385   You   11u  IPv6 0xac745b2749fd2be3      0t0  TCP *:ddi-tcp-1

(HÖREN) Dann machen Sie einfach (ps - eigentlich nicht. Bitte lesen Sie weiter unten):

kill -9 57385

3

Sie können Ihren Port in app.js oder in Ihrer Projektkonfigurationsdatei ändern.

Standard ('Port', 80)

und um zu sehen, ob Port 80 bereits verwendet wird, können Sie dies tun

netstat -antp | grep 80

netstat -antp | grep-Knoten

Vielleicht möchten Sie sehen, ob der Knotenprozess bereits ausgeführt wird oder nicht.

ps -ef | grep-Knoten

und wenn Sie feststellen, dass es bereits läuft, können Sie es mit töten

Killall-Knoten


3

Dies funktioniert auf dem Mac:

Schritt 1.

sudo lsof -i tcp:3000 (or whatever port you want to kill)

Der obige Befehl gibt Ihnen die Prozess-IDs an, die derzeit den Port halten.

Schritt 2.

Kill -9 <pid>

1

Ich habe 2 Server erstellt, die denselben Port 8081 überwachen und beim Lernen mit demselben Code ausgeführt werden

Die erste Servererstellung hat funktioniert. Die zweite Servererstellung ist mit EADDRINUSE fehlgeschlagen

Die Rückrufverzögerungen von node.js sind möglicherweise der Grund dafür, dass weder funktioniert noch die Erstellung des zweiten Servers eine Ausnahme hatte und das Programm beendet wurde, sodass der erste Server ebenfalls geschlossen wird

2 Server Problem Hinweis, ich habe von: Wie behebe ich Fehler: Hören Sie EADDRINUSE, während Sie nodejs verwenden?


1

Fehler: Hören Sie EADDRINUSE, um es in Ubuntu zu lösen, laufen Sie im Terminal netstat -nptl und danachkill -9 {process-number} ist dieser Befehl Knoten Prozess zu töten , und jetzt können Sie versuchen Sie es erneut server.js Knoten ausgeführt Befehl

Ex

höre EADDRINUSE ::: 8080

netstat -nptl

tcp6 0 0 ::: 9000 ::: * LISTEN 9660 / java
tcp6 0 0 ::: 5800 ::: * LISTEN -
tcp6 0 0 ::: 5900 ::: * LISTEN -
tcp6 0 0 ::: 8080 :: : * LISTEN 10401 / node
tcp6 0 0 ::: 20080 ::: * LISTEN 9660 / java
tcp6 0 0 ::: 80 ::: * LISTEN -
tcp6 0 0 ::: 22 ::: * LISTEN -
tcp6 0 0 ::: 10137 ::: * HÖREN 9660 / Java

töte -9 10401


2
Benutzer sagte, es ist unter Windows. Unter Windows werden netstatunterschiedliche Parameter empfangen. netstat -a -p tcp -b -vwürde den Prozessnamen ausgeben.
arboreal84

0

Ich habe Node Red auf meinem Mac und meinem Raspberry Pi installiert. Hatte genau das gleiche Problem und 'Killall' zu machen half nicht. Nachdem ich den Raspberry Pi heruntergefahren und meinen Computer neu gestartet hatte, funktionierte er einwandfrei.


0

Möglicherweise haben Sie versucht, den Befehl npm start auf zwei verschiedenen Registerkarten auszuführen. Sie können npm start nicht ausführen, wenn er bereits auf einer Registerkarte ausgeführt wird. Überprüfen Sie ihn einmal.


Bitte geben Sie weitere Details an.
DeshDeep Singh

0

Wenn Sie alle oben genannten Schritte ausgeführt haben, den Rouge-Vorgang jedoch immer noch nicht finden können, versuchen Sie es erneut. Stellen Sie jedoch sicher, dass Sie "sudo" vor den Befehlen einfügen.


0

Wenn Ihnen die Benutzeroberfläche besser gefällt, suchen Sie den Prozess Node.js im Windows-Task-Manager und beenden Sie ihn.


0

ps -ef | grep node find app.js, töte pid von app.js.


0

Töte den Knoten einfach als pkill -9-Knoten im Terminal von Ubantu als Startknoten


0

Sie müssen den Port beenden, indem Sie versuchen, den folgenden Befehl auf dem Terminal zu verwenden

$ sudo killall -9 nodejs

0

[Gelöst]

Es ist vielleicht zu spät, aber es funktioniert wie ein Zauber.

Sie müssen pm2installiert sein

npm install -g pm2

So stoppen Sie den aktuell laufenden Server (server.js):

pm2 stop -f server.js

0

Ich habe dieses Problem gelöst, indem ich unten in meiner package.json hinzugefügt habe , dass aktives PORT - 4000 (in meinem Fall), das unter WSL2 / Linux / Mac ausgeführt wird, beendet wurde

"scripts": {
    "dev": "nodemon app.js",
    "predev":"fuser -k 4000/tcp && echo 'Terminated' || echo 'Nothing was running on the PORT'",
  }

Quelle


-1

Um den Knotenserver zu beenden, führen Sie zuerst diesen Befehl in Ihrem Terminal aus:

  1. top
  2. Öffnen Sie ein anderes Fenster und kopieren Sie den Server idaus dem vorherigen Fenster. PID number -9 kill Nachdem Sie Ihren Knotenserver beendet haben, versuchen Sie erneut, Ihre App auszuführen.

-1

Ich habe den Befehl netstat -ano | grep "portnumber"verwendet, um die Portnummer / PID für diesen Prozess aufzulisten. Anschließend können Sie taskkill -f //pid 111111den Prozess beenden, wobei der letzte Wert die PID ist, die Sie im ersten Befehl finden.

Ein Problem, auf das ich manchmal stoße, ist das erneute Auftauchen des Knotens, selbst nachdem der Prozess abgebrochen wurde. Daher muss ich den guten alten Task-Manager verwenden, um den Knotenprozess manuell abzubrechen.


-4

Führen Sie im Fenster diesen Befehl aus:

taskkill /F /PID 1952

1
1952 ist eine Variable. Der zu tötende Prozess hat möglicherweise eine andere ID.
Entwurf durch Adrian
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.