it-swarm.com.de

Stoppen Sie das node.js-Programm von der Befehlszeile

Ich habe einen einfachen TCP Server, der einen Port abhört.

var net = require("net");

var server = net.createServer(function(socket) {
    socket.end("Hello!\n");
});

server.listen(7777);

Ich starte es mit node server.js und schließe es dann mit Strg + Z auf dem Mac. Wenn ich versuche, es erneut mit node server.js auszuführen, erhalte ich folgende Fehlermeldung:

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ß ich das Programm falsch? Wie kann ich das verhindern?

262
Eleeist

Um das Programm zu beenden, sollten Sie verwenden Ctrl + C. Wenn Sie dies tun, wird SIGINT gesendet, wodurch das Programm ordnungsgemäß beendet und von allen Ports, die es abhört, getrennt wird.

Siehe auch: https://superuser.com/a/262948/48624

366
Brad

Ctrl+Z setzt es aus, was bedeutet, dass es noch ausgeführt werden kann.

Ctrl+C wird es tatsächlich töten.

sie können es auch manuell wie folgt beenden:

ps aux | grep node

Suchen Sie die Prozess-ID (zweite von links):

kill -9 PROCESS_ID

Dies kann auch funktionieren

killall node
304
Jamund Ferguson

Oder alternativ können Sie alle diese Funktionen in einer Zeile ausführen:

kill -9 $(ps aux | grep '\snode\s' | awk '{print $2}')

Sie können den Knoten in '\ snode\s' durch einen beliebigen anderen Prozessnamen ersetzen. 

33
Hamid

sie können .exit eingeben, um den Knoten js REPL zu beenden

21
sunny1304

Wenn Sie Node.js interaktiv ausführen (die REPL):

Ctrl + C Sie werden zu> Eingabeaufforderung zurückgeleitet, und geben Sie Folgendes ein:

process.exit()

oder einfach benutzen Ctrl + D.

18
sr77in

Setzen Sie den Vorgang fort und beenden Sie ihn:

Ctrl+Z hält es an, was bedeutet, dass es immer noch als angehaltener Hintergrundprozess ausgeführt wird.

Sie befinden sich wahrscheinlich jetzt an einer Terminal-Eingabeaufforderung ...

  1. Geben Sie den Befehl fg ein, um den Vorgang im Vordergrund fortzusetzen.

  2. art 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, daher ist Sudo ... Ihr Freund.)

pkill -9 node

oder, wenn Sie nicht über pkill verfügen, kann dies funktionieren:

killall node

oder vielleicht das:

kill $(ps -e | grep node | awk '{print $1}')

manchmal listet der Prozess sein eigenes grep auf. In diesem Fall benötigen Sie:

kill $(ps -e | grep dmn | awk '{print $2}')

.


h/t @ Ruffin aus den Kommentaren zu der Frage selbst. Ich hatte das gleiche Problem und sein Kommentar half mir, es selbst zu lösen.

16
Metagrapher

$ Sudo killall node in einem anderen Terminal funktioniert auf mac , während killall node nicht funktioniert: 

$ killall node
No matching processes belonging to you were found
14
Maxim Yefremov

unter Linux versuchen Sie es mit: pkill node

an Fenstern:

Taskkill /IM node.exe /F

oder

from subprocess import call

call(['taskkill', '/IM', 'node.exe', '/F'])
6
Jason

Obwohl dies eine späte Antwort ist, habe ich dies aus NodeJS docs gefunden:

Das 'exit' -Ereignis wird ausgelöst, wenn REPL entweder durch Empfang des Befehls .exit als Eingabe verlassen wird, der Benutzer zweimal <ctrl>-C drückt, um SIGINT zu signalisieren, oder durch Drücken von <ctrl>-D, um 'end' im Eingangsstrom zu signalisieren. Der Listener-Callback wird ohne Argumente aufgerufen. 

Zusammenfassend können Sie das Programm beenden, indem Sie:

  1. Eingabe von .exit in nodejs REPL.
  2. Drücken Sie zweimal <ctrl>-C
  3. drücken Sie <ctrl>-D
  4. process.exit(0) bedeutet einen natürlichen Ausgang von REPL. Wenn Sie einen anderen Status zurückgeben möchten, können Sie eine Zahl ungleich Null zurückgeben. 
  5. Mit process.kill(process.pid) können Sie die Verwendung von nodejs api in Ihrem Code oder in REPL beenden.

Ich füge diese Antwort hinzu, da wir bei vielen Projekten mit Produktionsbereitstellungen Skripts haben, mit denen diese Prozesse angehalten werden.

Eine saubere Methode zur Verwaltung Ihrer Knotenserverprozesse ist das Paket forever (von NPM). 

Beispiel:

Für immer installieren

npm install forever -g

Führen Sie den Knotenserver aus

forever start -al ./logs/forever.log -ao ./logs/out.log -ae ./logs/err.log server.js

Ergebnis:

info: Forever processing file: server.js

Herunterfahren des Knotenservers

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.

3
Decoded

Ich bin auf ein Problem gestoßen, bei dem mehrere Knotenserver ausgeführt wird, und ich möchte nur einen von ihnen beenden und es über ein Skript erneut bereitstellen.

Hinweis: Dieses Beispiel befindet sich in einer Bash-Shell auf einem Mac.

Um dies zu tun, stelle ich sicher, dass mein node -Aufruf so spezifisch wie möglich ist. Anstatt beispielsweise node server.js Aus dem Apps-Verzeichnis aufzurufen, rufe ich node app_name_1/app/server.js Auf.

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 Ausgeführt haben, wird dieser Knotenprozess weiterhin ausgeführt.

Wenn Sie sich dazu entschließen, alle zu töten, können Sie killall node Verwenden, wie bereits erwähnt.

2
bapin93

Späte Antwort, aber unter Windows, wenn Sie den Task-Manager mit STRG + ALT + ENTF öffnen und Node.js-Prozesse beenden, wird dieser Fehler behoben.

2
Robert Molina

Wenn Sie Ihren Server mit npm stop oder ähnlichem stoppen möchten. Sie können den Code, der Ihren Serverprozess beendet, folgendermaßen schreiben: 

require('child_process').exec(`kill -9 ${pid}`)

Überprüfen Sie diesen Link für Details: https://Gist.github.com/dominhhai/aa7f3314ad27e2c50fd5

2
BigEgg

sie können folgenden Befehl ausführen, um in localserver kill spezifisch zu sein (hier: 8000)

http: // localhost: 8000 / kill PID (processId):

$:lsof -i tcp:8000

Es gibt Ihnen folgende Gruppen von TCPs:

COMMAND PID USER FD-GERÄTEGRÖSSE/NODE NAME

knoten 21521 Ubuntu 12u IPv6 345668 0t0 TCP *: 8000 (LISTEN)

$:kill -9 21521

Die processId, die TCP *: 8000 entspricht, wird beendet

0
Ank_247shbm

Für MacOS

  1. Terminal öffnen
  2. Führen Sie den folgenden Code aus und drücken Sie die Eingabetaste

     Sudo kill $(Sudo lsof -t -i:4200)
    
0

Mein Anwendungsfall: Führen Sie unter MacOSmehrere Knotenserver auf verschiedenen Ports in einem Skript 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 hört einen bestimmten TCP - Port unter Mac OS X?

0
Edan Chetrit

Bei Windows suchen Sie zuerst die PID mit Ihrer Portnummer

netstat -ano | findStr "portNumber"

Beenden Sie danach die Task und vergewissern Sie sich, dass Sie sich im Stammverzeichnis Ihres Laufwerks "c" befinden enter image description here Und der Befehl wird taskkill /F /PID your pid sein

0
gem007bd