So beenden Sie in Node.js

1867

Mit welchem ​​Befehl wird das Programm beendet? (dh den Node.js-Prozess beenden)

Bryan Field
quelle

Antworten:

2376

Rufen Sie die Methode des globalen processObjekts auf exit:

process.exit()

Aus den Dokumenten:

process.exit ([Code])

Beendet den Vorgang mit dem angegebenen Wert code. Wenn nicht angegeben, verwendet exit den Erfolgscode 0.

So beenden Sie das Programm mit einem Fehlercode:

process.exit(1);

Die Shell, die den Knoten ausgeführt hat, sollte den Exit-Code als sehen 1.

Pero P.
quelle
5
Ich möchte nur etwas hinzufügen. Wenn Sie eine Anfrage bearbeiten, sollten Sie auch end()die Anfrage bearbeiten. Sonst hängt es einfach.
Pixelfreak
126
@pixelfreak, exitist überhaupt nicht irreführend. Sie sind verwirrt darüber, wie Node funktioniert. Stellen Sie sich Node als den Server selbst vor. Es wird nicht nur nach Bedarf gestartet, da sich PHP auf einem Webserver wie Apache befindet. Node muss überhaupt nichts mit Webservern zu tun haben! Es ist nur ein Host für JavaScript, mit einigen raffinierten integrierten Bibliotheken, um nützliche Dinge zu tun.
Brad
6
@Brad und PHP ist eine Allzwecksprache. Sie müssen es nicht mit mod_phpApache ausführen oder verwenden. Sie können ein httpd in PHP erneut implementieren, wie es Node tut, wenn Sie wirklich einen vernünftigeren / standardisierteren Ansatz wie FastCGI möchten oder verwenden, genau wie Sie es in Node können.
Binki
38
Bitte beachten Sie, dass process.exit()wird nicht empfohlen , wie beschrieben in dieser Antwort unten .
AndreasPizsa
410

Nur eine Notiz , dass die Verwendung process.exit([number])ist nicht die empfohlene Praxis.

Durch das Aufrufen process.exit()wird der Prozess so schnell wie möglich beendet, auch wenn noch asynchrone Vorgänge ausstehen, die noch nicht vollständig abgeschlossen wurden, einschließlich E / A-Vorgängen an process.stdoutund process.stderr.

In den meisten Situationen ist es nicht erforderlich, process.exit()explizit aufzurufen . Der Node.js-Prozess wird von selbst beendet, wenn in der Ereignisschleife keine zusätzliche Arbeit ansteht. Die process.exitCodeEigenschaft kann festgelegt werden, um dem Prozess mitzuteilen, welcher Exit-Code verwendet werden soll, wenn der Prozess ordnungsgemäß beendet wird.

Das folgende Beispiel zeigt beispielsweise einen Missbrauch der process.exit()Methode, der dazu führen kann, dass gedruckte Daten stdoutabgeschnitten werden und verloren gehen:

// This is an example of what *not* to do:
if (someConditionNotMet()) {
  printUsageToStdout();
  process.exit(1);
}

Der Grund dafür ist, dass Schreibvorgänge process.stdoutin Node.js manchmal asynchron sind und über mehrere Ticks der Node.js-Ereignisschleife erfolgen können. Durch das Aufrufen process.exit()wird der Prozess jedoch beendet, bevor diese zusätzlichen Schreibvorgänge ausgeführt werden stdoutkönnen.

Anstatt process.exit()direkt aufzurufen , sollte der Code festlegen, process.exitCodedass der Prozess auf natürliche Weise beendet wird, indem vermieden wird, dass zusätzliche Arbeiten für die Ereignisschleife geplant werden:

// How to properly set the exit code while letting
// the process exit gracefully.
if (someConditionNotMet()) {
  printUsageToStdout();  
  process.exitCode = 1;
}
Dominic
quelle
31
Dies ist bei weitem die beste Antwort. Andere Antworten erlauben es dem Knoten möglicherweise nicht, ausstehende Ereignisse vor dem Beenden richtig zu verarbeiten, sehr traurig :(
Djabraham
3
Einverstanden, dies sollte mehr positive Stimmen haben! Ich hatte ein Knotenskript, das mehrere untergeordnete Prozesse über shelljs.exec startete, und ich wollte, dass mein Gesamtskript mit einem Fehler-Exit-Code zurückgegeben wird, wenn einer der untergeordneten Prozesse fehlschlägt. process.exitCode = 1 hat in den Exec-Rückrufen hervorragend funktioniert (während das einfache Aufrufen von process.exit (1) dort das Hauptskript beenden würde, bevor alle untergeordneten Prozesse abgeschlossen sind!)
Nick
15
Ich habe diese Antwort verwendet und festgestellt, dass mein Prozess nie wirklich beendet wurde. Musste es bei gedrückter Strg-C-Taste drücken.
JCollum
34
Es gibt viele Anwendungsfälle für den sofortigen Prozess und die bevorstehende Beendigung von Ereignissen. Genau dafür process.exit()ist gedacht.
Dominic Cerisano
7
Dies ist keineswegs die beste Antwort, da sie die Frage nicht beantwortet. Stattdessen werden Best Practices zum Entwickeln des Codeflusses für ein NodeJS-Programm beschrieben.
anon58192932
365

Aus der offiziellen nodejs.org- Dokumentation:

process.exit(code)

Beendet den Vorgang mit dem angegebenen Code. Wenn nicht angegeben, verwendet exit den Erfolgscode 0.

So beenden Sie das Programm mit einem Fehlercode:

process.exit(1);
alienhard
quelle
9
@ Alison ja, oder genauercode = 0; process.exit(code);
wprl
7
Stimmt es, dass Sie sich beim Verlassen wahrscheinlich nicht um den Wert von kümmern code?
Armand
8
@Alison Eine bessere Idee ist nur process.exit()ohne Parameter, da der Code standardmäßig 0 ist
Jeremy Moritz
2
@Armand Sie haben Recht - Code ist nur eine Variable und wird in diesem Fall verwendet, um den Parameter anzugeben. .Exit (0) macht also alles, was das Beispiel macht.
Gerard ONeill
23
@Armand der Code ist nicht für Sie, sondern für alles, was Ihren Code ausgeführt hat. Wenn Sie beispielsweise ein exit_0.js mit erstellen process.exit(0);und es damit ausführen node exit_0.js && echo 'success', wird "Erfolg" angezeigt . Wenn Sie exit_1.js mit erstellen process.exit(1);und ausführen node exit_1.js && echo 'success', wird nicht "Erfolg" angezeigt, da Ihr Prozess mit einem Wert ungleich Null beendet wurde (was auf einen "Fehler" oder einen "abnormalen Exit" der Shell hinweist). Außerdem werden unterschiedliche Werte angezeigt, $?wenn Sie node exit_1.jsvs ausführen node exit_0.js(Sie können dies überprüfen, indem Sie ausführen node exit_1.jsund dann ausführen echo $?).
msouth
277

Wenn Sie sich in einem Unix-Terminal oder einer Windows-Befehlszeile befinden und den Knoten REPL beenden möchten, entweder ...

  • Drücken Sie zweimal Ctrl+ Coder
  • Typ .exitund drücken Sie die Eingabetaste, oder
  • Drücken Sie Ctrl+ Dam Zeilenanfang (nur Unix)
Mohsen
quelle
14
Beachten Sie, dass die Tastenkombination Strg + D unter Mac oder Linux über Node hinaus auf fast allen Shells und REPLs funktioniert, auf die Sie jemals stoßen werden, einschließlich Unix-Shells wie Bash, den Shells für Datenbanken wie MySQL und PostgreSQL und den REPLs für Programmiersprachen wie Python, PHP und Ruby. Es ist die einzige Methode, um Muscheln zu verlassen, die ich jemals benutzt habe.
Mark Amery
2
Für die nodeREPL ist das Beenden von Strg + D ein Standardverhalten, daher funktioniert es auch unter Windows.
Alan
Drücken Sie Strg + C (auch auf einem Mac!)
Prince
124

Über die Befehlszeile .exitmöchten Sie Folgendes:

$ node
> .exit
$

Es ist in den REPL-Dokumenten dokumentiert . REPL (Read-Eval-Print-Loop) heißt die Node-Befehlszeile.

Verwenden Sie aus einem normalen Programm process.exit([code]).

Mike M. Lin
quelle
79

Dies hängt vom Grund ab, warum Sie bereit sind, den Prozess node.js zu beenden, ist jedoch in jedem Fall process.exit()die letzte zu berücksichtigende Option . Ein Zitat aus der Dokumentation:

Es ist wichtig zu beachten, dass der Aufruf process.exit()den Prozess zwingt, so schnell wie möglich zu beenden, selbst wenn noch asynchrone Vorgänge anstehen, die noch nicht vollständig abgeschlossen wurden, einschließlich E / A-Vorgängen an process.stdoutund process.stderr.

In den meisten Situationen ist es nicht erforderlich, process.exit()explizit aufzurufen . Der Node.js-Prozess wird von selbst beendet, wenn in der Ereignisschleife keine zusätzliche Arbeit ansteht. Die process.exitCodeEigenschaft kann festgelegt werden, um dem Prozess mitzuteilen, welcher Exit-Code verwendet werden soll, wenn der Prozess ordnungsgemäß beendet wird.

Lassen Sie uns mögliche Gründe behandeln, warum Sie möglicherweise bereit sind, den Prozess node.js zu beenden, und warum Sie Folgendes vermeiden sollten process.exit():

Fall 1 - Ausführung abgeschlossen (Befehlszeilenskript)

Wenn das Skript sein Ende erreicht hat und der Knoteninterpreter nicht beendet wird, zeigt dies an, dass einige asynchrone Vorgänge noch ausstehen. Es ist falsch, die Beendigung des Prozesses process.exit()an dieser Stelle zu erzwingen . Es ist besser zu versuchen zu verstehen, was Ihr Skript davon abhält, auf erwartete Weise beendet zu werden . Und wenn Sie dies erledigt haben, können Sie process.exitCodejedes Ergebnis an den aufrufenden Prozess zurückgeben.

Fall 2 - Beendigung aufgrund eines externen Signals (SIGINT / SIGTERM / other)

Zum Beispiel, wenn Sie bereit sind, eine Express- App ordnungsgemäß herunterzufahren . Im Gegensatz zum Befehlszeilenskript läuft die Express-App unendlich weiter und wartet auf neue Anforderungen. process.exit()Dies ist hier eine schlechte Option, da alle in der Pipeline befindlichen Anforderungen unterbrochen werden. Und einige von ihnen sind möglicherweise nicht idempotent (UPDATE, DELETE). Der Client wird nie erfahren, ob diese Anforderungen auf der Serverseite abgeschlossen sind oder nicht, und dies kann der Grund für Dateninkonsistenzen zwischen Client und Server sein. Die einzig gute Lösung besteht darin, den http-Server anzuweisen, keine neuen Anforderungen mehr anzunehmen und zu warten, bis ausstehende Anfragen abgeschlossen sind server.close():

var express = require('express');
var app = express();
var server = app.listen(80);

process.on( 'SIGTERM', function () {
   server.close(function () {
     console.log("Finished all requests");
   });
});

Wenn es immer noch nicht beendet wird - siehe Fall 1.

Fall 3 - Interner Fehler

Es ist immer besser, throweinen Fehler zu machen. Sie erhalten eine gut formatierte Stapelverfolgung und eine Fehlermeldung. Obere Codeebenen können immer entscheiden, ob sie error ( catch) behandeln oder den Prozess zum Absturz bringen können. Auf der anderen Seite process.exit(1)wird der Prozess stillschweigend beendet und es besteht keine Möglichkeit, sich davon zu erholen. Dies ist möglicherweise der einzige „Vorteil“ process.exit(). Sie können sicher sein, dass der Prozess beendet wird.

teq
quelle
4
Erstaunliche Antwort. Process.exit()sieht für die meisten Anwendungen wie ein großer Overkill aus. Ich suchte nach einem Äquivalent zur die () -Funktion von php ... eher wie:throw new Error('die msg')
AvadData
Wenn eine Reihe von Codes vorhanden ist, die kontinuierlich ausgeführt werden sollen, bis eine Anforderung zum Herunterfahren empfangen wird, gibt es eine nette Konvention zum Registrieren von Ereignissen, mit der Abonnements als Antwort auf eine Anforderung zum Herunterfahren abgebrochen werden können, ohne dass der Code die Ereignisse verwenden muss oder hat der Code, der das Herunterfahren anfordert, spezifische Kenntnisse über einander? Leider kann ich mir nur vorstellen, dass ein Code, der ein Ereignis registriert, auch einen Wrapper erstellt, der einen Abschluss zum Aufheben der Registrierung enthält.
Supercat
26

REPL (Befehlszeile)

  • Drücken Sie ctrl + c zweimal

  • Geben Sie ein .exitund drücken Sie die Eingabetaste

Skriptdatei

process.exit(code)

Der Knoten wird normalerweise mit Code 0 beendet, wenn keine asynchronen Operationen mehr anstehen.

process.exit(1) sollte verwendet werden, um mit einem Fehlercode zu beenden. Dadurch können wir schließen, dass der Knoten nicht ordnungsgemäß geschlossen wurde und zum Schließen gezwungen wurde.

Es gibt andere Exit-Codes wie

3 - Interner JavaScript-Analysefehler (sehr, sehr selten)

5 - Schwerwiegender Fehler in der Javascript-Engine der Version 8

9 - Ungültiges Argument

Eine vollständige Liste finden Sie unter Knoten-Exit-Codes

Siva Prakash
quelle
12

Ich habe eine Bewerbung, die ich wollte:

  1. Senden Sie eine E-Mail an den Benutzer
  2. Beenden Sie mit einem Fehlercode

Ich musste mich process.exit(code)an einen exitEreignishandler anschließen, sonst wird die E-Mail nicht gesendet, da ein process.exit(code)direkter Aufruf asynchrone Ereignisse beendet.

#!/usr/bin/nodejs
var mailer = require('nodemailer');
var transport = mailer.createTransport();
mail = {
  to: 'Dave Bowman',
  from: 'HAL 9000',
  subject: 'Sorry Dave',
  html: 'Im sorry, Dave. Im afraid I cant do <B>THAT</B>.'
}
transport.sendMail(mail);
//process.exit(1);
process.on('exit', function() { process.exit(1); });
Stephen Quan
quelle
4
Ich denke du willst process.exitCode
Julian de Bhal
Für die Aufzeichnung: Ich habe einen guten Teil des Tages damit verbracht, in einem von process.exitCodemir erstellten Befehlszeilentool (getestet auf Node v4.3.0) für mich zu arbeiten. Aber ich konnte es nicht dazu bringen, sich wie dokumentiert zu verhalten. Dies könnte sehr gut ein Randfall gewesen seincommander - obwohl github.com/tj/commander.js/… mich wundert. Ich bin mir nicht sicher, ob jemand anderes dieses Problem mit Knoten 4 gesehen hat, aber ich dokumentiere es nur für den Fall, dass ich später darauf zurückgreifen möchte.
Mikermcneil
In Bezug auf die Möglichkeit, dass dies vom Kommandanten kommt, habe ich mir auch die einzige Dep ( github.com/zhiyelee/graceful-readlink/… ) angesehen, aber keine Würfel. Ein möglicher Schuldiger scheint wie folgt zu sein: github.com/tj/commander.js/blob/… Insbesondere besteht das Problem darin, dass process.exitCode = 1der Prozess , selbst wenn Sie ihn festlegen , mit Code 0 beendet wird.
mikermcneil
11

Wie @Dominic hervorhob, ist es besser , einen nicht erfassten Fehler auszulösen, anstatt process.exit ([code]) aufzurufen :
process.exitCode = 1; throw new Error("my module xx condition failed");

MANN
quelle
3
Im Zusammenhang mit der Frage "Wie man in Node.js beendet" ist dies ein schrecklicher Rat. Ihr Vorschlag wäre viel sinnvoller, wenn in der Frage speziell gefragt würde, wie bei einem Fehler beendet werden soll. Ich empfehle dringend, dass Sie Ihre Antwort so formulieren, dass der Benutzer nur dann das tut, was Sie vorschlagen, wenn er im Fehlerfall versucht, die Anwendung zu beenden .
Stapelhaus
@rstackhouse, ich hoffe, Sie haben einen nicht erfassten
MANN
5
Das Problem beim Werfen ist die hässliche Stapelspur. Gibt es einen Tipp zur Vermeidung dieser Stapelverfolgung (nicht relevant, wenn das CLI-Tool beendet werden soll, wenn die Verwendung nicht korrekt ist)?
MoOx
9

Beenden

let exitCode = 1;
process.exit(exitCode)

Nützliche Exit-Codes

1 - Catchall für allgemeine Fehler
2 - Missbrauch von Shell-Builtins (gemäß Bash-Dokumentation)
126 - Der aufgerufene Befehl kann nicht ausgeführt werden
127 - "Befehl nicht gefunden"
128 - Ungültiges Argument zum Beenden
128 + n - Schwerwiegendes Fehlersignal "n"
130 - Skript von Control-C beendet
255 \ * - Status außerhalb des Bereichs verlassen
Denis Lisitskiy
quelle
Erwägen
Cmag
7

Von Code können Sie verwenden , process.exit([errorcode])wo [errorcode]eine optionale ganze Zahl ( 0ist der Standard Erfolg anzuzeigen).

Wenn Sie die Read Eval Print Loop (REPL) verwenden , können Sie Ctrl+ Doder tippen.exit

Alternativ können Sie unter Windows oder Linux Ctrl+ C, Ctrl+ verwendenC

Auf dem Mac lautet der Befehl Ctrl+ Z, Ctrl+Z

zzzzBov
quelle
2
Zwei Kontroll- node --version v0.10.18
Cs
Control-C scheint bereits geplante Vorgänge nicht abzubrechen, während Strg-Z den Vorgang auf dem Mac unverzüglich abbricht.
Jorisw
7

Drücken Sie Ctrl + Czweimal oder .exit.

> 
(To exit, press ^C again or type .exit)
> 
HeadAndTail
quelle
3

Ich konnte alle meine Knotenprozesse direkt aus der Git Bash-Shell unter Windows 10 zum Sterben bringen, indem taskkill -F -IM node.exeich tippte - dies beendet alle Knotenprozesse auf meinem Computer auf einmal. Ich fand, ich könnte auch verwenden taskkill //F //IM node.exe. Nicht sicher, warum beide -und //in diesem Zusammenhang arbeiten. Hoffe das hilft!

Alison Stuart
quelle
Das liegt am Taskkill selbst. Sie töten Prozesse selbst. Auch ein einzelnes / ist ausreichend.
Paul Stelian
2

Da der Prozess ein globales Objekt ist, müssen Sie kein Modul importieren. Die folgende Funktion beendet oder beendet den aktuellen Knotenprozess.

process.exit (Code)

process.kill (process.pid)

process.abort ()

sumit_suthar
quelle
1

Öffnen Sie das Befehlszeilenterminal, auf dem die Knotenanwendung ausgeführt wird, und drücken Sie Strg + C.

Wenn Sie eine Knoten-js-Anwendung aus dem Code beenden möchten,

process.exit(); // graceful termination 
process.exit(1); // non graceful termination 
Shekar Mania
quelle
0

Wenn Sie die Anwendung des Knotens js beenden möchten, schreiben Sie

process.exit(1)

in Ihrem Code

Ajay Mudaliyar
quelle
3
1 wird verwendet, um anzuzeigen, dass in der Anwendung ein Fehler aufgetreten ist, den die anderen Antworten bereits verdeutlichen.
Herick
0

Das Beenden in Knoten js erfolgt auf zwei Arten:

  • Der Aufruf process.exit () explizit.
  • Oder wenn die Ereignisschleife von nodejs mit allen Aufgaben ausgeführt wird und nichts mehr zu tun ist. Dann wird die Knotenanwendung automatisch beendet.

Wie es funktioniert?

Wenn Sie die Ausführungsschleife zwingen möchten, den Prozess zu stoppen, können Sie den globalen Variablenprozess verwenden, der eine Instanz von EventEmitter ist . Wenn Sie also process.exit () aufrufen, geben Sie tatsächlich das Exit- Ereignis aus, das alle Aufgaben sofort beendet, auch wenn noch keine asynchronen Vorgänge ausgeführt wurden.

process.exit () verwendet einen Exit-Code (Integer) als Parameter. Der Code 0 ist die Standardeinstellung und bedeutet, dass er mit einem "Erfolg" beendet wird. Während der Code 1 bedeutet, dass er mit einem "Fehler" beendet wird.

Majid Jiji
quelle
0

Wenn Sie sich in Windows befinden, gehen Sie zum Task-Manager, dann zu Prozesse, suchen Sie nach einem Prozess namens "Knoten", klicken Sie mit der rechten Maustaste darauf und klicken Sie dann auf die Option "Prozess beenden".

Albos Hajdari
quelle
-1

Sie können die Funktion process.exit ([Code]) verwenden.

Wenn Sie ohne Fehler beenden möchten, verwenden Sie den folgenden Code 0:

process.exit(0);

So beenden 1Sie das Programm mit einem Fehlercode:

process.exit(1);

Der Fehlercode des Fehlers ist anwendungsspezifisch. Sie können also Ihre eigenen Konventionen dafür verwenden.

Oleksii Trekhleb
quelle