Beenden Sie node.js ordnungsgemäß


77

Ich lese das ausgezeichnete Online-Buch http://nodebeginner.org/ durch und probiere den einfachen Code aus

var http = require("http");

function onRequest(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}

http.createServer(onRequest).listen(8888); 

Jetzt wusste ich nicht (und ich weiß immer noch nicht!), Wie man node.js ordnungsgemäß herunterfährt, also ging ich einfach ctrl+z. Jedes Mal, wenn ich versuche zu laufen, node server.jserhalte ich die folgenden Fehlermeldungen.

node.js:134
        throw e; // process.nextTick error, or 'error' event on first tick
        ^
Error: EADDRINUSE, Address already in use
    at Server._doListen (net.js:1100:5)
    at net.js:1071:14
    at Object.lookup (dns.js:153:45)
    at Server.listen (net.js:1065:20)
    at Object.<anonymous> (/Users/Bob/server.js:7:4)
    at Module._compile (module.js:402:26)
    at Object..js (module.js:408:10)
    at Module.load (module.js:334:31)
    at Function._load (module.js:293:12)
    at Array.<anonymous> (module.js:421:10)

Also zwei Fragen:

1) Wie schalte ich node.js ordnungsgemäß aus?

2) Wie repariere ich das Chaos, das ich erstellt habe?


Überprüfen Sie die folgende Frage: Graceful Shutdown eines Node.JS HTTP-Servers .
Jdavies

19
Zu Ihrer Information bedeutet Strg + Z "Pause". Nachdem Sie einen Prozess angehalten haben, können Sie Folgendes eingeben fg(um ihn normal fortzusetzen) oder bg(um ihn im Hintergrund fortzusetzen).
s4y

1
Das Schreiben fgvon Bash hat für mich auf centOS6 großartig funktioniert !! viel, viel einfacher als akzeptierte Antwort: DD +2 Sir, wenn ich könnte
RozzA

das ist viel einfacher.
Raaz

Antworten:


55
  1. Verwenden Sie Ctrl+ C, um den Knotenprozess ordnungsgemäß zu beenden

  2. Um das Chaos zu beseitigen, hängt es von Ihrer Plattform ab. Grundsätzlich müssen Sie jedoch die Überreste des Prozesses finden, in dem der Knoten ausgeführt wurde, und ihn beenden.

    Unter Unix: erhalten ps -ax | grep nodeSie beispielsweise einen Eintrag wie:

    1039 ttys000    0:00.11 node index.js
    

    Wo index.jsist der Name Ihrer Knotendatei?

    In diesem Beispiel ist 1039 die Prozess-ID (Ihre wird anders sein), kill -9 1039beendet sie also und Sie können erneut eine Verbindung zum Port herstellen.


2
Beachten Sie, dass Strg + C ein SIGINT ausgibt, das den Prozess standardmäßig sofort stoppt. killsendet das SIGTERM-Signal, das üblicherweise zum Starten eines eleganteren Herunterfahrens verwendet wird. Unix-Signale
Bhurlow

4
SIGHUP (1), SIGINT (2), SIGTERM (3)... SIGKILL (9). Ihr numerischer Wert ist direkt proportional zu ihrer Schwere und umgekehrt proportional zur Wahrscheinlichkeit eines "ordnungsgemäßen Herunterfahrens" - Anwendung bereit. kill -9aka kill -KILL, die mit Vorurteilen endet (Prozess wird einfach ohne Vorwarnung beendet). kill -TERMfordert Sie bitte auf, einen Prozess sofort zu beenden, kill -INTbeendet einfache Dinge wie cat und veranlasst kill -HUPmanchmal einen Prozess, seine Konfiguration neu zu laden. kill -TERMFTW.
Orwellophile

Unter @BHBH SIGINTwird allgemein auch verstanden, dass ein ordnungsgemäßer Ausstieg angefordert wird. Die von Ihnen verlinkte Ressource SIGTERMist nahezu identisch. In vielen Diskussionen werden die Unterschiede untersucht. @Orwellophile weder SIGINTnoch irgendein anderes Signal diskriminieren aufgrund der "Einfachheit" der Prozesse oder der von ihnen ausgeführten Programme; Sie können Ihre Beschreibungen sicher SIGTERMund SIGINTin einer zusammenfassen, damit Sie Ihre Leser nicht verwirren.
Der

127

Ich verwende derzeit das Ereignissystem von Node, um auf Signale zu reagieren. So verwende ich das Strg-C-Signal (SIGINT) in einem Programm:

process.on( 'SIGINT', function() {
  console.log( "\nGracefully shutting down from SIGINT (Ctrl-C)" );
  // some other closing procedures go here
  process.exit( );
})

Sie haben den Fehler "Adresse in Verwendung" erhalten, weil Strg-Z das Programm nicht beendet. Der Prozess wird nur auf einem Unix-ähnlichen Betriebssystem angehalten, und das im Hintergrund platzierte Knotenprogramm war weiterhin an diesen Port gebunden.

Auf Unix-ähnlichen Systemen ist [Strg + Z] die häufigste Standardtastaturzuordnung für die Tastenfolge, mit der ein Prozess angehalten wird (SIGTSTP). [3] Bei der Eingabe durch einen Benutzer an seinem Computerterminal wird dem aktuell ausgeführten Vordergrundprozess ein SIGTSTP-Signal gesendet, wodurch der Prozess im Allgemeinen seine Ausführung unterbricht. Der Benutzer kann die Prozessausführung später fortsetzen, indem er den Befehl 'fg' (kurz für Vordergrund) oder 'bg' (kurz für Hintergrund) und darüber hinaus den Befehl 'disown' eingibt, um den Hintergrundprozess vom Terminal zu trennen. 1

Sie müssten Ihre Prozesse kill <pid>beenden , indem Sie einen oder 'killall -9 node' oder ähnliches ausführen.


3
killall -9ist ein bisschen drastisch; Ich würde nicht dorthin gehen, es sei denn killall -INToder einfach killallnicht funktionieren.
icktoofay

3
Zusätzlich zu SIGINT möchte man möglicherweise auch auf SIGTERM und SIGHUP hören und eine on uncaughtException und einen onexit haben. Signal 9 (SIGKILL) kann nicht abgehört werden. Wenn Sie das verwenden, ist es tot.
Paul

Was wäre der Beispielcode, wenn Sie möchten, dass alle aktuellen Anforderungen gelöscht werden und keine neuen Anforderungen akzeptiert werden, bevor Sie den Knotenprozess ordnungsgemäß herunterfahren?
CMCDragonkai

1
Es war perfekt, mit 'fg' wieder in den laufenden Prozess einzusteigen. Vielen Dank, Sir +1, eine viel bessere Option als töten
RozzA

22

Da node.js eine ereignisgesteuerte Laufzeit ist, besteht der eleganteste Exit darin, die Warteschlange ausstehender Ereignisse zu erschöpfen. Wenn die Ereigniswarteschlange leer ist, wird der Prozess beendet. Sie können sicherstellen, dass die Ereigniswarteschlange leer ist, indem Sie beispielsweise alle festgelegten Intervall-Timer löschen und alle Server mit offenen Socket-Verbindungen herunterfahren. Bei der Verwendung von Modulen von Drittanbietern wird es schwieriger, da Sie der Frage ausgeliefert sind, ob der Modulautor darauf geachtet hat, die von ihm erstellten ausstehenden Ereignisse ordnungsgemäß zu löschen. Dies ist möglicherweise nicht der praktischste Weg, um einen node.js-Prozess zu beenden, da Sie viel Aufwand aufwenden müssen, um "durchgesickerte" ausstehende Ereignisse aufzuspüren, aber ich denke , es ist der eleganteste.


Das ist interessant, können Sie ein Beispiel geben?
Bluekeys

1
Irgendeine Idee, wie man das debuggt? Ist es möglich, die verbleibenden Ereignisse auf der Konsole auszudrucken?
leszek.hanusz

Ich bin daran interessiert, bestehende Anfragen ordnungsgemäß zu bearbeiten und neue zu blockieren. Aber ich bin auch an eleganten Neuladungen interessiert, sodass alle neuen Anforderungen eine neue Konfiguration verwenden.
CMCDragonkai

7

Geben Sie entweder ein

process.exit()

oder

.exit

verlassen nodeanmutig.

Wenn Sie zweimal Control+ Cdrücken, wird das Verlassen erzwungen.


0

1) Wie schalte ich node.js ordnungsgemäß aus?

Auf ein SIGINT-Signal warten. Unter Windows müssen Sie mit dem Readline-Modul auf Strg-C warten.

Ich habe meine eigene Lösung geschrieben, um einer Anwendung ein ordnungsgemäßes Herunterfahren und die Verwendung von Domänen zu ermöglichen: Gnade . Ein Blick lohnt sich.

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.