Stoppen Sie das Programm node.js über die Befehlszeile

304

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.jsund 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?

Eleeist
quelle
2
Wahrscheinlich hinzuzufügen , dass Strg-Z setzt einen Befehl auf * NIX, und zwar nicht in der Nähe. Wenn Sie fgnach 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!
Ruffin
1
@ Ruffin Dies sollte eine Antwort sein. Wenn Sie die Ctrl+ZAktion ausgeführt haben, besteht eine geeignete Methode fgdarin, den Prozess wiederzubeleben und ihn dann Ctrl+Cordnungsgemäß abzubrechen.
Metagrapher

Antworten:

393

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

Brad
quelle
21
Ctrl + Cfunktioniert bei mir nicht Nur ^Cwird in die Konsole eingegeben, und das Programm wird beendet nicht.
Eleeist
1
@Eleeist, was benutzt du als Terminal? Es funktioniert großartig für mich.
Brad
2
@Eleeist, Sie haben wahrscheinlich Ihre Schlüssel oder etwas neu zugeordnet. Ctrl+Cfunktioniert 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.
Brad
1
@ jt0dd Du könntest immer 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.
Brad
1
Ich hatte dieses Problem, als ich den Tastaturtyp in einer anderen Sprache verwendete.
Stellen
325

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:

ps aux | grep node

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

kill -9 PROCESS_ID

Dies kann auch funktionieren

killall node
Jamund Ferguson
quelle
Strg + C wird funktionieren, aber keiner dieser Befehle wird für mich funktionieren. Ich weiß nicht warum? Und ich suche nach Kommandozeilenlösung
wütend Kiwi
7
Seien Sie vorsichtig mit Killall Node, Sie könnten einen Prozess beenden, den Sie nicht beenden möchten, wenn sie mit "Node" übereinstimmen
Samuel Bolduc
1
Vielleicht möchten Sie killall nodein Ihrer Antwort nach oben gehen, da dies wirklich die einfachste und zuverlässigste Option ist (solange Sie alle Instanzen töten können)
Boern
4
'killall' wird nicht als interner oder externer Befehl, bedienbares Programm oder Batchdatei erkannt. Vermisse ich etwas
Ayyash
Gleich hier ... Keine Antwort? Es heißt, "Killall" wird nicht erkannt. Keiner der anderen Befehle funktioniert auch nicht. Muss ich meinen Computer neu starten oder was?
Methodician
37

Alternativ können Sie all dies 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 anderen Prozessnamen ersetzen.

Hamid Tavakoli
quelle
2
Alternativ können Sie immer versuchen: ps -ef | grep "node" | awk '{print $ 2}' | Xargs töten -9
Frymaster
Scheint zu funktionieren, bringt mich aber nicht richtig zu einer Eingabeaufforderung zurück. Gedanken?
Devil's Advocate
25

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 ...

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

  2. 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.)

pkill -9 node

oder, wenn Sie kein pkill haben, kann dies funktionieren:

killall node

oder vielleicht das:

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

Manchmal listet der Prozess seinen eigenen Grep auf. In diesem Fall benötigen Sie:

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

.


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

Metagrapher
quelle
22

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

sunny1304
quelle
2
Dies setzt voraus, dass Sie sich zunächst in REPL befinden . Was ist, wenn ein Knotenskript ausgeführt wird?
IgorGanapolsky
18

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

Ctrl+ Cbringt Sie zurück zur Eingabeaufforderung> und gibt Folgendes ein:

process.exit()

oder benutze einfach Ctrl+ D.

sr77in
quelle
17

$ sudo killall nodein einem anderen Terminal funktioniert auf Mac , während killall nodenicht funktioniert:

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

unter Linux versuchen: pkill node

unter Windows:

Taskkill /IM node.exe /F

oder

from subprocess import call

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

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

Das 'Exit'-Ereignis wird ausgegeben, wenn die REPL entweder durch Empfangen des .exitBefehls als Eingabe, <ctrl>-Czweimaliges Drücken des Benutzers zum Signalisieren von SIGINT oder durch Drücken <ctrl>-Dvon' Signal 'im Eingabestream beendet wird. Der Listener-Rückruf wird ohne Argumente aufgerufen.

Zusammenfassend können Sie also beenden, indem Sie:

  1. Typing .exitin NodeJS REPL.
  2. <ctrl>-CZweimal drücken .
  3. drücken <ctrl>-D.
  4. 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.
  5. process.kill(process.pid) ist der Weg, um mit nodejs api aus Ihrem Code oder aus REPL zu töten.
RandominstanceOfLivingThing
quelle
5

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 foreverPakets (von NPM).

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.

Entschlüsselt
quelle
3

Wenn Sie Ihren Server mit npm stopoder so etwas stoppen möchten . Sie können den Code, der Ihren Serverprozess beendet, wie folgt schreiben:

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

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

BigEgg
quelle
2

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 nodeAnruf so spezifisch wie möglich ist. Zum Beispiel rufe node server.jsich 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.jsdiesen Knoten ausgeführt haben, wird der Prozess fortgesetzt.

Wenn Sie sich entscheiden, sie alle zu töten, können Sie alles verwenden, killall nodewas andere erwähnt haben.

bapin93
quelle
2

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.

Robert Molina
quelle
2

Sie können den folgenden Befehl ausführen, um die lokale Server-Tötung genau zu bestimmen (hier: 8000).

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

$:lsof -i tcp:8000

Sie erhalten folgende Gruppen von TCPs:

BEFEHL PID USER FD TYP GERÄTE GRÖSSE / AUS NODENNAME

Knoten 21521 ubuntu 12u IPv6 345668 0t0 TCP *: 8000 (HÖREN)

$:kill -9 21521

Die Prozess-ID, die TCP *: 8000 entspricht, wird beendet

Ank_247shbm
quelle
2

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)
Siddhant Senapati
quelle
2

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:

fuser <<target_port>>/tcp

Angenommen, der Port ist 8888, der Befehl lautet:

fuser 8888/tcp

Und um einen Prozess zu beenden , der auf einem Port ausgeführt wird, fügen Sie einfach -k switch hinzu.

fuser <<target_port>>/tcp -k

Beispiel (Port ist 8888):

fuser 8888/tcp -k

Das ist es! Dadurch wird der Prozess geschlossen, der den Port überwacht. Normalerweise mache ich das, bevor ich meine Serveranwendung ausführe.

Vikram Bankar
quelle
1

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?

Edan Chetrit
quelle
0

Suchen Sie bei Windows zuerst die PID mit Ihrer Portnummer

netstat -ano | findStr "portNumber"

Beenden Sie danach die Aufgabe und stellen Sie sicher, dass Sie sich im Stammverzeichnis Ihres Laufwerks "c" befinden Geben Sie hier die Bildbeschreibung ein . Der Befehl lautet danntaskkill /F /PID your pid

gem007bd
quelle
0

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

Geben Sie hier die Bildbeschreibung ein

Drücken Sie y, wenn Sie dazu aufgefordert werden.

Geben Sie hier die Bildbeschreibung ein

Vielen Dank

MindRoasterMir
quelle