Ich habe einen einfachen TCP-Server, der einen Port überwacht.
var net = require("net");
var server = net.createServer(function(socket) {
socket.end("Hello!\n");
});
server.listen(7777);
Ich beginne es mit node server.js
und schließe es dann mit Strg + Z auf dem Mac. Wenn ich versuche, es erneut mit auszuführen node server.js
, wird folgende Fehlermeldung angezeigt:
node.js:201
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: listen EADDRINUSE
at errnoException (net.js:670:11)
at Array.0 (net.js:771:26)
at EventEmitter._tickCallback (node.js:192:41)
Schließe ich das Programm falsch? Wie kann ich dies verhindern?
fg
nach Strg-Z tippen , sind Sie wieder da, wo Sie aufgehört haben. Ihr früherer Knoten läuft also noch. Achten Sie darauf, ob Sie dies auch für andere Befehle tun!Ctrl+Z
Aktion ausgeführt haben, besteht eine geeignete Methodefg
darin, den Prozess wiederzubeleben und ihn dannCtrl+C
ordnungsgemäß abzubrechen.Antworten:
Um das Programm zu beenden, sollten Sie Ctrl+ verwenden C. Wenn Sie dies tun, wird gesendet
SIGINT
, wodurch das Programm ordnungsgemäß beendet werden kann und die Verbindung zu den Ports, die es abhört, getrennt wird.Siehe auch: https://superuser.com/a/262948/48624
quelle
Ctrl + C
funktioniert bei mir nicht Nur^C
wird in die Konsole eingegeben, und das Programm wird beendet nicht.Ctrl+C
funktioniert gut. In jedem Fall ist dies ein anderes Problem als Ihr eigentliches Problem. Sie sollten eine Frage "Strg + C funktioniert nicht" bei SuperUser.com posten.kill -9
, aber ich würde nicht. Sind Sie sich wirklich sicher, dass Ihre Anwendung immer noch die Ports offen hält? Ich habe dieses Problem nie gehabt. Sobald meine Bewerbung endet, werden die Verbindungen immer sofort beendet. Ich würde netstat verwenden, um festzustellen, ob Ihre App oder etwas anderes auf diesem Port verweilt.Ctrl+ Zsetzt es aus, was bedeutet, dass es noch ausgeführt werden kann.
Ctrl+ Cwird es tatsächlich töten.
Sie können es auch manuell wie folgt töten:
Suchen Sie die Prozess-ID (zweite von links):
Dies kann auch funktionieren
quelle
killall node
in Ihrer Antwort nach oben gehen, da dies wirklich die einfachste und zuverlässigste Option ist (solange Sie alle Instanzen töten können)Alternativ können Sie all dies in einer Zeile ausführen:
Sie können den Knoten in '\ snode \ s' durch einen anderen Prozessnamen ersetzen.
quelle
Setzen Sie den Vorgang fort und beenden Sie ihn:
Ctrl+ Zsetzt es aus, was bedeutet, dass es immer noch als angehaltener Hintergrundprozess ausgeführt wird.
Sie befinden sich jetzt wahrscheinlich an einer Terminal-Eingabeaufforderung ...
Geben Sie den Befehl ein
fg
, um den Vorgang im Vordergrund fortzusetzen.tippe Ctrl+ C, um es richtig zu töten.
Alternativ können Sie es manuell wie folgt beenden:
( HINWEIS: Für die folgenden Befehle ist möglicherweise root erforderlich, ebenso
sudo ...
wie für Ihren Freund.)oder, wenn Sie kein pkill haben, kann dies funktionieren:
oder vielleicht das:
Manchmal listet der Prozess seinen eigenen Grep auf. In diesem Fall benötigen Sie:
.
h / t @ruffin aus den Kommentaren zur Frage selbst. Ich hatte das gleiche Problem und sein Kommentar half mir, es selbst zu lösen.
quelle
Sie können
.exit
eingeben, um den Knoten js REPL zu beendenquelle
Wenn Sie Node.js interaktiv ausführen (REPL):
Ctrl+ Cbringt Sie zurück zur Eingabeaufforderung> und gibt Folgendes ein:
oder benutze einfach Ctrl+ D.
quelle
$ sudo killall node
in einem anderen Terminal funktioniert auf Mac , währendkillall node
nicht funktioniert:quelle
unter Linux versuchen:
pkill node
unter Windows:
oder
quelle
Obwohl dies eine späte Antwort ist, habe ich dies aus NodeJS-Dokumenten gefunden :
Zusammenfassend können Sie also beenden, indem Sie:
.exit
in NodeJS REPL.<ctrl>-C
Zweimal drücken .<ctrl>-D
.process.exit(0)
was bedeutet, ein natürlicher Ausstieg aus REPL. Wenn Sie einen anderen Status zurückgeben möchten, können Sie eine Zahl ungleich Null zurückgeben.process.kill(process.pid)
ist der Weg, um mit nodejs api aus Ihrem Code oder aus REPL zu töten.quelle
Ich füge diese Antwort hinzu, weil wir für viele Projekte mit Produktionsbereitstellungen Skripte haben, die diese Prozesse stoppen, damit wir nicht müssen.
Eine saubere Möglichkeit, Ihre Node Server-Prozesse zu verwalten, ist die Verwendung des
forever
Pakets (vonNPM
).Beispiel:
Für immer installieren
npm install forever -g
Führen Sie Node Server aus
forever start -al ./logs/forever.log -ao ./logs/out.log -ae ./logs/err.log server.js
Ergebnis:
info: Forever processing file: server.js
Knotenserver herunterfahren
forever stop server.js
Ergebnis
info: Forever stopped process: uid command script forever pid id logfile uptime [0] sBSj "/usr/bin/nodejs/node" ~/path/to/your/project/server.js 23084 13176 ~/.forever/forever.log 0:0:0:0.247
Dadurch wird Ihre Serveranwendung sauber heruntergefahren.
quelle
Wenn Sie Ihren Server mit
npm stop
oder so etwas stoppen möchten . Sie können den Code, der Ihren Serverprozess beendet, wie folgt schreiben:Überprüfen Sie diesen Link für Details: https://gist.github.com/dominhhai/aa7f3314ad27e2c50fd5
quelle
Ich bin auf ein Problem gestoßen, bei dem mehrere Knotenserver ausgeführt werden, und ich möchte nur einen von ihnen beenden und ihn über ein Skript erneut bereitstellen .
Hinweis: Dieses Beispiel befindet sich in einer Bash-Shell auf einem Mac.
Dazu stelle ich sicher, dass mein
node
Anruf so spezifisch wie möglich ist. Zum Beispiel rufenode server.js
ich an, anstatt aus dem Apps-Verzeichnis anzurufennode app_name_1/app/server.js
Dann kann ich es töten mit:
kill -9 $(ps aux | grep 'node\ app_name_1/app/server.js' | awk '{print $2}')
Dadurch wird nur der Knotenprozess beendet, auf dem app_name_1 / app / server.js ausgeführt wird.
Wenn Sie
node app_name_2/app/server.js
diesen Knoten ausgeführt haben, wird der Prozess fortgesetzt.Wenn Sie sich entscheiden, sie alle zu töten, können Sie alles verwenden,
killall node
was andere erwähnt haben.quelle
Eine späte Antwort, aber unter Windows, wenn Sie den Task-Manager mit STRG + ALT + ENTF öffnen und dann die Prozesse von Node.j beenden, wird dieser Fehler behoben.
quelle
Sie können den folgenden Befehl ausführen, um die lokale Server-Tötung genau zu bestimmen (hier: 8000).
Sie erhalten folgende Gruppen von TCPs:
Die Prozess-ID, die TCP *: 8000 entspricht, wird beendet
quelle
Für MacOS
Führen Sie den folgenden Code aus und drücken Sie die Eingabetaste
quelle
Sie können die Fixiereinheit verwenden , um das zu erreichen, was Sie tun möchten.
Um die Prozess-IDs der Aufgaben zu erhalten, die an einem Port ausgeführt werden, haben Sie folgende Möglichkeiten:
Angenommen, der Port ist 8888, der Befehl lautet:
Und um einen Prozess zu beenden , der auf einem Port ausgeführt wird, fügen Sie einfach -k switch hinzu.
Beispiel (Port ist 8888):
Das ist es! Dadurch wird der Prozess geschlossen, der den Port überwacht. Normalerweise mache ich das, bevor ich meine Serveranwendung ausführe.
quelle
Mein Anwendungsfall: Führen Sie unter MacOS mehrere Knotenserver an verschiedenen Ports eines Skripts aus bzw. führen Sie sie erneut aus
run :
"cd $PATH1 && node server1.js & cd $PATH2 && node server2.js & ..."
stop1 :
"kill -9 $(lsof -nP -i4TCP:$PORT1 | grep LISTEN | awk '{print $2}')"
stop2, stop3 ...
Wiederholung :
"stop1 & stop2 & ... & stopN ; run
Weitere Informationen zum Suchen eines Prozesses über einen Port: Wer überwacht einen bestimmten TCP-Port unter Mac OS X?
quelle
Suchen Sie bei Windows zuerst die PID mit Ihrer Portnummer
Beenden Sie danach die Aufgabe und stellen Sie sicher, dass Sie sich im Stammverzeichnis Ihres Laufwerks "c" befinden . Der Befehl lautet dann
taskkill /F /PID your pid
quelle
Wenn Sie VS-Code und Terminal verwenden, wählen Sie zuerst den Knoten aus der rechten Dropdown-Liste aus und führen Sie dann Strg + C aus. Dann funktioniert es
Drücken Sie y, wenn Sie dazu aufgefordert werden.
Vielen Dank
quelle