Knoten / Express: EADDRINUSE, bereits verwendete Adresse - Server beenden


442

Ich habe einen einfachen Server in node.js mit connect:

var server = require('connect').createServer();
//actions...
server.listen(3000);

In meinem Code habe ich tatsächliche Handler, aber das ist die Grundidee. Das Problem, das ich immer wieder bekomme, ist

EADDRINUSE, Address already in use

Ich erhalte diesen Fehler, wenn ich meine Anwendung erneut ausführe, nachdem sie zuvor abgestürzt ist oder Fehler aufgetreten sind. Da ich keine neue Instanz des Terminals öffne, schließe ich den Prozess mit ab ctr + z.

Ich bin mir ziemlich sicher, dass ich nur den Server oder die Verbindung schließen muss. Ich habe versucht Aufruf server.close()in process.on('exit', ...);ohne Glück.


39
Eigentlich sollten Sie stattdessen Ctrl + zverwenden Ctrl + c, um das Programm durch Senden von SIGQUIT korrekt zu schließen :) Weitere Informationen finden Sie im Wiki :)
nacho4d

1
Du meinst SIGINT. SIGQUIT ist aufgrund von Strg + \
Xedecimal

53
Versuchen Sie pkill nodejsoder pkill nodewenn unter UNIX-ähnlichen Betriebssystem
Gerard

1
Ich hatte ein ähnliches Problem und fand dieses Paket, mit dem Sie sauber beenden können,
Jazzy

1
1. Es scheint, als ob eine baumelnde oder tote Prozess-ID am Port zwischengespeichert ist. Der knotenbasierte Dienst wird also nicht gestartet und wirft den Fehler PORT IN USE (FEHLERADRESSE IN USE) aus. 2. Wir versuchen herauszufinden, wie die ID freigegeben werden kann Port 10000 ohne Neustart des Servers.
Abksharma

Antworten:


146

process.on('exit', ..)wird nicht aufgerufen, wenn der Prozess abstürzt oder beendet wird. Es wird nur dann , wenn die Ereignisschleifenende genannt, und da server.close() Art Enden der Ereignisschleife (es derzeit noch warten muss für Stapel hier läuft und da) es macht keinen Sinn , dass im Innern des Exit - Ereignis setzen ...

Beim Absturz tun process.on('uncaughtException', ..)und beim Töten tunprocess.on('SIGTERM', ..)

Abgesehen davon lässt SIGTERM (Standard-Kill-Signal) die App bereinigen, während SIGKILL (sofortige Beendigung) die App nichts tun lässt.


3
Es ist auch ein nützlicher Hook für process.on ('SIGINT', ...)
farincz

486

Sie können auch die Befehlszeilenroute gehen:

ps aux | grep node

um die Prozess-IDs zu erhalten.

Dann:

kill -9 PID

Wenn Sie beim Töten -9 ausführen, wird ein SIGKILL gesendet (anstelle eines SIGTERM). SIGTERM wurde von Node für mich manchmal ignoriert.


1
ps aux | grep nodezeigt nichts; textareaserver --editor-cmd='gvim -f'schlägt immer noch fehl: 14 Mar 21:19:30 - socket.io bereit - Verbindungen akzeptieren Konnte jetzt den Server starten: EADDRINUSE, Adresse bereits in Gebrauch
Jean Jordaan

75
Warum das eher alskillall -9 node
Martin Josefsson

1
pidofist auch praktisch
JVE999

25
Ich habe diese Antwort lange Zeit verwendet und sie dann eines Tages der lsof -n -i4TCP:8000 | grep LISTEN | tr -s ' ' | cut -f 2 -d ' ' | xargs kill -9
Einfachheit halber zu einem Einzeiler zusammengefasst

1
Ich hatte mehrere Knotenserver gleichzeitig ausgeführt, einige davon Electron-Apps. Ich musste nur killmit der spezifischen Prozess-ID verwenden killall.
Tuliomir

225

Zunächst möchten Sie wissen, welcher Prozess verwendet wird port 3000

sudo lsof -i :3000

Dadurch werden alle PIDs aufgelistet, die an diesem Port lauschen. Sobald Sie die PID haben , können Sie sie wie folgt beenden:

kill -9 {PID}

17
Dieser Befehl identifiziert die PID im Gegensatz zur Ausgabe von ps aux | grep nodefür mich eindeutig . Ich brauchte auch nichtsudo
Phil Gibbins

Dies ist die beste Antwort. Funktionierte gut mit Port 8081 und verwendete React Native mit Garn.
Fernando Barbosa

Das hat bei mir super funktioniert. Ich konnte feststellen, wo der Port 3000 verwendet wurde, und ihn so schließen. Ich brauchte auch nicht sudo.
Campalo

Sehr gut. Ich habe es auch versucht, nachdem ich den Befehl erhalten hatte, killall -9 {COMMAND}zBkillall -9 node
STREET MONEY

wow es hat bei mir funktioniert
Anoop PS

160

Ich habe dies auf meinem Laptop mit win8 getroffen. das hat funktioniert.

Führen Sie cmd.exe als 'Administrator' aus:

C:\Windows\System32>taskkill /F /IM node.exe
SUCCESS: The process "node.exe" with PID 11008 has been terminated.

Ich habe es über das Befehlsfenster ausgeführt und es versehentlich geschlossen. Der Knoten rannte weiter in den Hintergrund ... (auch nach Beendigung der Sitzung). In meinem Fall wurde der Browser-Tab, der über Web-Sockets mit ihm verbunden war, endgültig geschlossen.
Bertus Kruger

6
taskkill /F /IM node.exefunktioniert wie ein Zauber für mich unter Windows aus jedem Verzeichnis :-) Danke für die Freigabe !!
Marty McGee

2
Dies ist die einzige einzeilige Arbeitslösung, die ich für Windows überprüfen konnte
Code Whisperer

4
Funktioniert unter Windows 10. Ich musste die cmd.exe übrigens nicht als admin ausführen.
Glenn Werner

74

Überprüfen Sie die PID, dh die ID des Prozesses, der auf Port 3000 ausgeführt wird, mit dem folgenden Befehl:

lsof -i tcp:3000

Es würde ungefähr Folgendes ausgeben:

COMMAND  PID   USER   FD   TYPE  DEVICE  SIZE/OFF NODE NAME
node     5805  xyz    12u  IPv6  63135    0t0     TCP  *:3000 (LISTEN)

Beenden Sie nun den Prozess mit:

kill -9 5805

Dies funktionierte für mich bei Verwendung des Sls Offline Plugins.
Junaid Atique

Danke dafür! Ich habe gerade angefangen zu lernen, wie vor Stunden zu reagieren. :) Nachdem ich den Server gestoppt habe, habe ich ihn erneut ausgeführt, nur um auf solche Fehler zu stoßen.
Glenn

Ich bekomme keine Ausgabe, wenn ich verloren benutze. Bedeutet dies, dass es in diesem Bereich keinen Prozess gibt?
x89


29

Linux

Führen Sie psdie PID Ihres Knotenprozesses aus und bestimmen Sie sie.

Dann renne sudo kill PID

Windows

Verwenden Sie die Aufgabenliste, um die Liste der ausgeführten Prozesse anzuzeigen:

tasklist /O

Beenden Sie dann den Knotenprozess wie folgt (unter Verwendung der vom tasklistBefehl erhaltenen PID ):

taskkill /pid PID

1
Und wenn unter Windows?
Trevor

1
Nur als Hinweis ... aus irgendeinem Grund musste ich für den Taskkill-Befehl von git-bash doppelte Schrägstriche auf meinen Flags verwenden: taskkill //IM node.exe und ich habe gerade den Knoten getötet. hat funktioniert.
Nawlbergs

23

Hier ist ein Einzeiler (ersetzen Sie 3000 durch einen Port oder eine Konfigurationsvariable):

kill $(lsof -t -i:3000)

20

Ich habe diesen Fehler einmal erhalten und viele der hier verfolgten Ansätze gewählt.

Mein app.listen(3000);Problem war, dass ich zwei Aufrufe im selben app.js-Skript hatte. Die erste app.listen () war erfolgreich, während die zweite den Fehler verursachte.

Ein weiterer nützlicher Befehl, auf den ich beim Debuggen sudo fuser -k 3000/tcpgestoßen bin, war das Beenden von unerwünschten Prozessen, die Sie möglicherweise gestartet haben (einige Prozesse werden möglicherweise neu gestartet, z. B. wenn sie mit forever.js ausgeführt werden, aber für mich nützlich).


das gleiche Problem hier ... seltsam, dass es beim Debuggen richtig funktioniert hat, während dieser Fehler zum Laufen gebracht wurdenpm start
Asqan

16

Öffnen Sie für Windows den Task-Manager und suchen Sie nach node.exe-Prozessen. Töte sie alle mit End Task.

Geben Sie hier die Bildbeschreibung ein


1
so einfach und unkompliziert für Windows-Benutzer
Mutter

Es klappt. Danke
Najathi

14
ps aux | grep node
kill -9 [PID] (provided by above command)

Beschreibung:


  1. ps gibt den Prozessstatus an, aux liefert die Liste von a: allen Benutzerprozessen, u: benutzereigenen Prozessen, x: allen anderen Prozessen, die nicht an das Terminal angeschlossen sind.
  2. Rohrsymbol: | wird das Ergebnis von ps aux übergeben, um weiter zu manipulieren.
  3. grep durchsucht die angegebene Zeichenfolge (in unserem Fall den Knoten) aus der von ps aux bereitgestellten Liste.

12

Zu Ihrer Information, Sie können den Prozess in einem Befehl beenden sudo fuser -k 3000/tcp. Dies kann für alle anderen Ports wie 8000, 8080 oder 9000 durchgeführt werden, die üblicherweise für die Entwicklung verwendet werden.



11

Finden Sie zuerst heraus, was läuft mit:

sudo lsof -nP -i4TCP:3000 | grep LISTEN

Sie erhalten so etwas wie:

php-fpm 110 root    6u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 274 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 275 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)

Dann können Sie den Prozess wie folgt beenden:

sudo kill 110

Dann können Sie ausgeführt werden, ohne die Listen-EADDRINUSE ::: 3000-Fehler zu erhalten


Ich verwende nodemon und es startet den Dienst erneut. Ist es eine Möglichkeit, Nodemon zu töten?
Smit Patel

10

Für Visual Studio Noobs wie mich

Möglicherweise führen Sie den Prozess in anderen Terminals aus!

Nach dem Schließen des Terminals in Visual Studio verschwindet das Terminal einfach .

Ich habe manuell ein neues erstellt und gedacht, dass das vorherige zerstört wurde. In Wirklichkeit habe ich jedes Mal, wenn ich auf Neues Terminal geklickt habe , ein neues über den vorherigen erstellt .

Also habe ich das erste Terminal gefunden und ... Voila, ich habe den Server dort betrieben.

Mehrere Terminals, ohne es zu merken


1
Oh ja mein Bruder.
Jaydeep Shil

8

Task-Manager (Strg + Alt + Entf) ->

Registerkarte Prozesse ->

Wählen Sie den Prozess "node.exe" und klicken Sie auf "Prozess beenden".


Warum den gesamten Knotenprozess beenden, wenn ein Knotenportprozess beendet werden soll?
Jimmy Obonyo Abor

8

Es kann vorkommen, dass Szenarien auftreten, in denen selbst das Beenden des Threads oder Prozesses die App nicht tatsächlich beendet (dies passiert bei mir gelegentlich unter Linux und Windows). Manchmal läuft möglicherweise bereits eine Instanz, die Sie nicht geschlossen haben.

Aufgrund dieser Umstände ziehe ich es vor, meine package.json:

"scripts": {
    "stop-win": "Taskkill /IM node.exe /F",
    "stop-linux": "killall node"
},

Ich kann sie dann anrufen mit:

npm run stop-win
npm run stop-Linux

Sie können schicker werden und diese BIN-Befehle mit einem Argument-Flag erstellen, wenn Sie möchten. Sie können diese auch als Befehle hinzufügen, die innerhalb einer try-catch-Klausel ausgeführt werden sollen.


5

In Windows-Benutzern: Öffnen task managerund end taskdie nodejs.exeDatei, es funktioniert gut.


4

Sie können Hot-Node verwenden, um zu verhindern, dass Ihr Server abstürzt / Laufzeitfehler auftreten. Hot-Node startet die NodeJS-Anwendung automatisch neu, wenn sich das Knotenprogramm [Quelle] / Prozess [Knotenprogramm ausführen] ändert.

Installieren Sie den Hot-Node mit npm mithilfe der globalen Option:

npm install -g hotnode


pm2 ist eine bessere Wahl. robuster, mehr Optionen. und hat nicht das Problem, wenn als Root ausgeführt wird, das für immer hat.
Lucas

@Lucas Was ist dieses Grundproblem für immer, von dem du sprichst? Ich bin leider gezwungen, für immer ein Produkt anstelle von pm2 für ein Produkt bei der Arbeit zu verwenden (aufgrund eines Lizenzmangels), und das macht mir große Sorgen!
GPX

4

Unter gebührender Berücksichtigung aller Antworten im Formular möchte ich einen Punkt hinzufügen.

Ich habe festgestellt, dass beim Beenden einer Knoten-App bei einem Fehler mit Strg + Z beim nächsten Versuch beim Öffnen derselbe Fehler EADDRINUSE auftritt.

Wenn ich eine Knoten-App mit Strg + C beende, funktioniert dies beim nächsten Öffnen problemlos.

Durch Ändern der Portnummer in eine andere als die fehlerhafte wurde das Problem behoben.


1
Strg + C ist richtig. Ich habe die gleiche Portnummer wie zuvor verwendet und es hat wie zuvor funktioniert.
Vipulnj

2
<key> Strg-Z </ key> stoppt den Prozess nicht. Es wird in den Hintergrund gestellt, sodass Sie andere Befehle ausführen können. Dies ist eine Unix-Shell-Sache. Um den Vorgang fortzusetzen, verwenden Sie fgdieselbe Konsole. Sie können dann sehen, was auf diesem Server passiert, nachdem Sie verschiedene Befehle in die Befehlszeile eingegeben haben.
Alexis Wilke

4

Unter Linux.

Funktion hinzufügen zu ~/.bashrc:

function killTcpListen () {
  kill -9 $(lsof -sTCP:LISTEN -i:$1 -t)
}

Änderungen ziehen: source ~/.bashrc

Und benutze es: killTcpListen 3000


3

Nur für den Fall zu überprüfen , ob Sie diese Zeile hinzugefügt haben mehrere Male versehentlich

app.listen(3000, function() {
  console.log('listening on 3000')
});

Der obige Code ist für Express, aber überprüfen Sie einfach, ob Sie versuchen, denselben Port zweimal in Ihrem Code zu verwenden.


3

Win10, Git Bash v2.15, Node v8.9.1, npm v5.5.1

Ich hatte ein package.json-Skript, um den Knoten zu starten: "start": "node index.js"

Wann immer ich dies benutzte, unabhängig davon, ob ich es mit Strg + C beendet hatte, stieß ich auf dieses Problem.

Wenn ich nur node index.jsvon git bash npm run startgelaufen bin und mit Strg + c getötet habe, habe ich diesen Fehler nie bekommen.

Ich bin mir nicht sicher, warum, aber ich dachte, das könnte jemandem helfen.


1
Ich bekomme das gleiche Problem mit im Wesentlichen dem gleichen Setup. In meinem Fall ist mir aufgefallen, dass das Ausführen einer Express-App über npm zwei Prozesse erzeugt, aber nur einer ist geschlossen, wenn Strg + c verwendet wird. Wenn Sie die App nur mit einem Knoten starten, ist nur ein Prozess geöffnet und wird ordnungsgemäß geschlossen.
Worc

1
Dieses Problem mit Git für Windows wirft eine Art Licht auf das Ganze. Es scheint, als gäbe es irgendwo einen Fehler zwischen Minze und Cygwin-Abhängigkeit.
Worc

3

UI-Lösung Für Windows-Benutzer: Ich stellte fest, dass die Top-Antworten bei mir nicht funktionierten. Es handelte sich anscheinend um Befehle für Mac- oder Linux-Benutzer. Ich habe eine einfache Lösung gefunden, für die keine Befehle erforderlich sind: Öffnen Sie den Task-Manager (Strg + Umschalt + Esc). Sehen Sie sich die laufenden Hintergrundprozesse an. Suchen Sie nach Node.js und beenden Sie die Aufgabe.

Nachdem ich dies getan hatte, verschwand das Problem für mich. Wie in anderen Antworten angegeben, werden Hintergrundprozesse noch ausgeführt, da zuvor ein Fehler aufgetreten ist und die regulären Exit- / Bereinigungsfunktionen nicht aufgerufen wurden. Eine Möglichkeit, sie zu beenden, besteht darin, den Prozess im Task-Manager zu finden und dort zu beenden . Wenn Sie den Prozess von einem Terminal / einer PowerShell aus ausgeführt haben, können Sie ihn normalerweise mit Strg + C beenden.


Ja, richtig, danke für
deine

3

Umschreiben von @Gerards Kommentar in meiner Antwort:

Versuchen Sie es pkill nodejsoder pkill nodeunter einem UNIX-ähnlichen Betriebssystem.

Dadurch wird der Prozess beendet, auf dem der Knotenserver ausgeführt wird, der auf einem beliebigen Port ausgeführt wird. Hat für mich gearbeitet.

Namaste🙏


2

Der Knoten läuft irgendwo im Speicher und hat diesen Port gesperrt. Unter Windows tritt dieses Problem wie bei den meisten Windows-Problemen durch Drücken von CTRL+ ALT+ DELund / oder Neustart auf.


Diese Frage beantwortet so viele andere Fragen. Schalten Sie es aus und wieder ein. Genius.
datUser

1

Gründe für diese Probleme sind:

  1. Auf diesem Port kann eine beliebige Anwendung wie Skype ausgeführt werden.
  2. Der Knoten ist möglicherweise abgestürzt und der Port wurde möglicherweise nicht freigegeben.
  3. Möglicherweise haben Sie versucht, mehrere Server zu starten. Um dieses Problem zu lösen, kann ein Boolescher Wert beibehalten werden, um zu überprüfen, ob der Server gestartet wurde oder nicht. Es sollte nur gestartet werden, wenn boolean false oder undefined zurückgibt.

1

server.close () benötigt eine Weile, um die Verbindung zu schließen. Daher sollten wir dies als asynchronen Aufruf ausführen:

await server.close();

WICHTIG: Wenn Sie await verwenden , müssen Sie das Schlüsselwort async in unserer Kapselungsfunktion als solches verwenden:

async () => {
  await server.close();
}

1

Verwenden Sie den folgenden Befehl im Terminal / cmd, um den Port zu ändern (npm run dev ist für node.js). Möglicherweise haben Sie andere Befehle, um Ihre App auszuführen. Die meisten davon funktionieren beim Ändern des Ports einfacher und schneller. Darüber hinaus können Sie anstelle von 3002 eine beliebige Portnummer verwenden, die in Ihrem System frei ist

PORT=3002 npm run dev

In den meisten Fällen, wenn Sie das Projekt ausführen, während Sie es abrupt oder unwissentlich beenden, drücken Sie Strg + z, um den Port zu verlassen. Wählen Sie immer Control + c, das den Port nicht verlässt, um den Server oder das Projekt auszuführen.

Außerdem ist es Zeit, die Portnummer in Ihrem Code zu ändern

server.listen(3002);

0

Dies bedeutet, dass zwei Knotenserver auf demselben Port ausgeführt werden. Wenn einer auf Port ausgeführt wird, z. B. 3000, ändern Sie den anderen in einen anderen Port, z. B. 3001, und alles funktioniert einwandfrei

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.