Comment quitter dans Node.js


1869

Quelle est la commande utilisée pour quitter? (c'est-à-dire terminer le processus Node.js)

Réponses:


2377

Appelez la méthode de processl'objet global exit:

process.exit()

De la documentation:

process.exit ([code])

Termine le processus avec le spécifié code. S'il est omis, exit utilise le code «succès» 0.

Pour quitter avec un code «échec»:

process.exit(1);

Le shell qui a exécuté le nœud doit voir le code de sortie comme 1.


5
Je veux juste ajouter quelque chose. Si vous traitez une demande, vous devez également end()la demander également. Sinon, ça va juste se bloquer.
pixelfreak

126
@pixelfreak, exitn'est pas du tout trompeur. Vous ne savez pas comment fonctionne Node. Considérez Node comme le serveur lui-même. Il ne se déclenche pas uniquement au besoin, comme PHP se trouve dans un serveur Web comme Apache. Node n'a même rien à voir avec les serveurs Web! C'est juste un hôte pour certains JavaScript, avec quelques bibliothèques intégrées astucieuses pour faire des choses utiles.
Brad

6
@Brad et PHP est un langage à usage général. Pas besoin de l'exécuter avec mod_phpou d'utiliser Apache. Vous pouvez réimplémenter un httpd en PHP comme le fait le nœud si vous voulez vraiment ou utiliser une approche plus saine / standardisée comme FastCGI comme vous le pouvez dans le nœud.
binki

38
Veuillez noter que ce process.exit()n'est pas recommandé , comme décrit dans cette réponse ci-dessous .
AndreasPizsa

410

Juste une note que l'utilisation process.exit([number])n'est pas recommandée .

L'appel process.exit()forcera le processus à se terminer le plus rapidement possible même s'il y a encore des opérations asynchrones en attente qui ne sont pas encore complètement terminées, y compris les opérations d'E / S vers process.stdoutet process.stderr.

Dans la plupart des situations, il n'est pas réellement nécessaire d'appeler process.exit()explicitement. Le processus Node.js se terminera de lui-même s'il n'y a aucun travail supplémentaire en attente dans la boucle d'événement. La process.exitCodepropriété peut être définie pour indiquer au processus le code de sortie à utiliser lorsque le processus se termine normalement.

Par exemple, l'exemple suivant illustre une mauvaise utilisation de la process.exit()méthode qui pourrait entraîner la stdouttroncature et la perte de données imprimées :

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

La raison pour laquelle cela pose problème est que process.stdout dans Node.js sont parfois asynchrones et peuvent se produire sur plusieurs ticks de la boucle d'événements Node.js. L'appel process.exit(), cependant, force le processus à se terminer avant que ces écritures supplémentaires stdoutpuissent être effectuées.

Plutôt que d'appeler process.exit()directement, le code devrait définir le process.exitCodeet permettre au processus de se terminer naturellement en évitant de planifier tout travail supplémentaire pour la boucle d'événement:

// How to properly set the exit code while letting
// the process exit gracefully.
if (someConditionNotMet()) {
  printUsageToStdout();  
  process.exitCode = 1;
}

31
C'est de loin la meilleure réponse. D'autres réponses pourraient ne pas permettre au nœud de traiter correctement les événements en attente avant de quitter, très triste :(
djabraham

3
D'accord, cela devrait avoir plus de votes positifs! J'avais un script de nœud qui donnait le coup d'envoi à plusieurs processus enfants via shelljs.exec et je voulais que mon script global revienne avec un code de sortie d'erreur si l'un des processus enfants échouait. process.exitCode = 1 fonctionnait très bien dans les rappels exec (alors que simplement appeler process.exit (1) là-dedans quitterait le script principal avant la fin de tous les processus enfants!)
Nick

15
J'ai utilisé cette réponse et j'ai constaté que mon processus n'était jamais réellement sorti. J'ai dû le ctrl-C.
jcollum

34
Il existe de nombreux cas d'utilisation pour le processus immédiat et la fin d'un événement en attente. C'est exactement ce qui process.exit()est prévu.
Dominic Cerisano

7
Ce n'est pas la meilleure réponse par n'importe quel tronçon car cela ne répond pas à la question. Au lieu de cela, il donne les meilleures pratiques sur la façon de développer le flux de code pour un programme nodejs.
anon58192932

365

De la documentation officielle de nodejs.org :

process.exit(code)

Termine le processus avec le code spécifié. S'il est omis, exit utilise le code «succès» 0.

Pour quitter avec un code «échec»:

process.exit(1);

9
@Alison oui, ou plus précisément code = 0; process.exit(code);
wprl

7
Est-il vrai que si vous sortez, vous ne vous souciez probablement pas de la valeur de code?
Armand

8
@Alison Une meilleure idée est tout simplement process.exit()sans paramètre car le code par défaut est 0
Jeremy Moritz

2
@Armand Vous avez raison - Le code est juste une variable, et dans ce cas utilisé pour indiquer quel est le paramètre. Donc .exit (0) fait tout ce que fait l'exemple.
Gerard ONeill

23
@Armand le code n'est pas pour vous, c'est pour tout ce qui a couru votre code. Par exemple, si vous créez un exit_0.js avec process.exit(0);et l'exécutez avec, node exit_0.js && echo 'success'il dira "succès". Si vous créez exit_1.js avec process.exit(1);et exécutez, node exit_1.js && echo 'success'il ne dira pas "succès" puisque votre processus s'est terminé avec un non-zéro (ce qui indique une "panne" ou une "sortie anormale" au shell). De plus, vous verrez différentes valeurs dans $?si vous exécutez node exit_1.jsvs node exit_0.js(vous pouvez vérifier en faisant node exit_1.jspuis en faisant echo $?).
msouth

277

Si vous êtes dans un terminal Unix ou une ligne de commande Windows et que vous souhaitez quitter le Node REPL, soit ...

  • Appuyez sur Ctrl+C deux fois ou
  • tapez .exitet appuyez sur Entrée, ou
  • appuyez sur Ctrl+ Dau début d'une ligne (Unix uniquement)

14
Notez que, au-delà de Node, le raccourci Ctrl + D sur Mac ou Linux fonctionne sur presque tous les shells et REPL que vous rencontrerez, y compris les shells Unix comme Bash, les shells pour les bases de données comme MySQL et PostgreSQL, et les REPL pour les langages de programmation comme Python, PHP et Ruby. C'est la seule méthode de sortie de shell que j'utilise.
Mark Amery

2
Pour le nodeREPL, Ctrl + D pour quitter est un comportement standard, donc cela fonctionne également sur Windows.
Alan

Appuyez sur Ctrl + C (même sur un Mac!)
Prince

124

A partir de la ligne de commande, .exitc'est ce que vous voulez:

$ node
> .exit
$

Il est documenté dans les documents REPL . REPL (Read-Eval-Print-Loop) est ce que la ligne de commande Node est appelée.

À partir d'un programme normal, utilisez process.exit([code]).


79

Cela dépend de la raison pour laquelle vous êtes prêt à quitter le processus node.js, mais dans tous les cas, process.exit()c'est la dernière option à considérer . Une citation de la documentation:

Il est important de noter que l'appel process.exit()forcera le processus à se terminer le plus rapidement possible, même s'il y a encore des opérations asynchrones en attente qui ne sont pas encore complètement terminées, y compris les opérations d'E / S vers process.stdoutet process.stderr.

Dans la plupart des situations, il n'est pas réellement nécessaire d'appeler process.exit()explicitement. Le processus Node.js se terminera de lui-même s'il n'y a aucun travail supplémentaire en attente dans la boucle d'événement. La process.exitCodepropriété peut être définie pour indiquer au processus le code de sortie à utiliser lorsque le processus se termine normalement.

Voyons les raisons possibles pour lesquelles vous pourriez vouloir quitter le processus node.js et pourquoi vous devriez éviter process.exit() :

Cas 1 - Exécution terminée (script de ligne de commande)

Si le script a atteint sa fin et que l'interpréteur de noeud ne se ferme pas, cela indique que certaines opérations asynchrones sont toujours en attente. Il est faux de forcer l'arrêt du processus process.exit()à ce stade. Il est préférable d'essayer de comprendre ce qui empêche votre script de se terminer de la manière attendue . Et lorsque vous réglez cela, vous pouvez utiliser process.exitCodepour renvoyer n'importe quel résultat au processus d'appel.

Cas 2 - Résiliation en raison d'un signal externe (SIGINT / SIGTERM / autre)

Par exemple, si vous êtes prêt à fermer gracieusement une application express . Contrairement au script de ligne de commande, l'application express continue de fonctionner indéfiniment, en attendant de nouvelles demandes. process.exit()sera une mauvaise option ici car cela va interrompre toutes les demandes en cours de traitement. Et certains d'entre eux peuvent être non-idempotents (UPDATE, DELETE). Le client ne saura jamais si ces demandes sont terminées ou non côté serveur et cela pourrait être la raison de l'incohérence des données entre le client et le serveur. La seule bonne solution consiste à dire au serveur http de ne plus accepter de nouvelles requêtes et d'attendre que les requêtes en attente se terminent par 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");
   });
});

S'il ne se ferme toujours pas - voir le cas 1.

Cas 3 - Erreur interne

Il vaut toujours mieux throwune erreur, vous obtiendrez une trace de pile bien formatée et un message d'erreur. Les niveaux supérieurs de code peuvent toujours décider s'ils peuvent gérer error ( catch) ou le laisser planter le processus. De l'autre côté, process.exit(1)le processus se terminera en silence et il n'y aura aucune chance de s'en remettre. C'est peut-être le seul «avantage» de process.exit(), vous pouvez être sûr que le processus sera terminé.


4
Réponse incroyable. Process.exit()ressemble à une surpuissance majeure pour la plupart des applications. Je cherchais un équivalent à la fonction die () de php ... plus comme:throw new Error('die msg')
AvadData

Si l'on a un tas de code qui est censé s'exécuter en continu jusqu'à la réception d'une demande d'arrêt, y a-t-il une bonne convention pour l'enregistrement des événements qui permettrait d'abandonner les abonnements en réponse à une demande d'arrêt, sans que cela nécessite le code en utilisant les événements ou le code demandant l'arrêt a des connaissances spécifiques les uns sur les autres? Malheureusement, la seule façon dont je peux penser à implémenter un peu ce serait d'exiger que tout morceau de code qui enregistre un événement crée également un wrapper qui comprend une fermeture pour le désinscrire.
supercat

26

REPL (ligne de commande)

  • Appuyez ctrl + c deux fois

  • Tapez .exitet appuyez sur Entrée

Fichier de script

process.exit(code)

Le nœud se termine normalement avec le code 0 lorsqu'aucune opération asynchrone n'est en attente.

process.exit(1) devrait être utilisé pour quitter avec un code d'échec. Cela nous permettra de déduire que le nœud ne s'est pas fermé correctement et a été forcé de se fermer.

Il existe d'autres codes de sortie comme

3 - Erreur d'analyse JavaScript interne (très très rare)

5 - Erreur fatale dans le moteur javascript v8

9 - Argument invalide

Pour la liste complète, voir les codes de sortie des nœuds


12

J'ai une application que je voulais:

  1. Envoyer un e-mail à l'utilisateur
  2. Quitter avec un code d'erreur

J'ai dû me connecter process.exit(code)à un exitgestionnaire d'événements, sinon le courrier ne sera pas envoyé car l'appelant process.exit(code)tue directement les événements asynchrones.

#!/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); });

4
Je pense que vous voulez process.exitCode
Julian de Bhal

Pour mémoire: j'ai passé une bonne partie de la journée à essayer de me mettre process.exitCodeau travail dans un outil en ligne de commande que je construis (testé sur Node v4.3.0). Mais je ne pouvais pas le faire se comporter comme documenté. Cela aurait très bien pu être un cas de pointe avec commander- bien que github.com/tj/commander.js/… me fasse me demander. Je ne sais pas si quelqu'un d'autre a vu ce problème avec le noeud 4, mais documentant juste au cas où il serait utilisé ultérieurement.
mikermcneil

Concernant la possibilité que cela vienne du commandant, j'ai également regardé son seul dep ( github.com/zhiyelee/graceful-readlink/… ) mais pas de dés. Seul coupable possible semble être: github.com/tj/commander.js/blob/… Plus précisément, le problème est que, même si vous définissez process.exitCode = 1, le processus se
termine

11

Comme l'a souligné @Dominic, il est préférable de lancer une erreur non interceptée au lieu d'appeler process.exit ([code]) :
process.exitCode = 1; throw new Error("my module xx condition failed");


3
Pris dans le contexte de la question "Comment sortir dans Node.js", c'est un conseil horrible. Votre suggestion aurait beaucoup plus de sens si la question demandait spécifiquement comment sortir en cas d'erreur. Je vous suggère fortement de formuler votre réponse de manière à indiquer que l'utilisateur fait ce que vous proposez, uniquement s'il essaie de quitter l'application en cas d' erreur .
rstackhouse

@rstackhouse, j'espère que vous avez réussi à lancer une erreur non détectée
MANN

5
Le problème avec le lancer est la laideur comme trace de pile d'enfer. Une astuce pour éviter cette trace de pile (non pertinent lorsque l'outil CLI veut quitter si l'utilisation n'est pas correcte)?
MoOx

9

Pour quitter

let exitCode = 1;
process.exit(exitCode)

Codes de sortie utiles

1 - Catchall pour les erreurs générales
2 - Utilisation abusive des commandes internes de shell (selon la documentation de Bash)
126 - La commande invoquée ne peut pas s'exécuter
127 - «commande introuvable»
128 - Argument non valide pour quitter
128 + n - Signal d'erreur fatale "n"
130 - Script terminé par Control-C
255 \ * - Statut de sortie hors limites

Pensez à mettre à jour votre réponse, nodejs.org/api/process.html#process_process_exit_code
Cmag

7

À partir du code, vous pouvez utiliser process.exit([errorcode])[errorcode]est un entier facultatif ( 0c'est la valeur par défaut pour indiquer le succès).

Si vous utilisez la boucle de lecture Eval (REPL) , vous pouvez utiliser Ctrl+ Dou taper.exit

Alternativement, sur Windows ou Linux, vous pouvez utiliser Ctrl+ C, Ctrl+C

Sur Mac, la commande est Ctrl+ Z, Ctrl+Z


2
Deux travaux de contrôle c sur le mac aussi, au moins sur le mien avec node --version v0.10.18
msouth

Control-C ne semble pas annuler les opérations déjà planifiées, tandis que ctrl-z tue le processus sans délai, sur Mac.
jorisw

7

Appuyez Ctrl + Cdeux fois sur ou .exit.

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

3

J'ai pu faire en sorte que tous mes processus de nœuds meurent directement à partir du shell Git Bash sur Windows 10 en tapant taskkill -F -IM node.exe- cela met fin à tous les processus de nœuds sur mon ordinateur à la fois. J'ai trouvé que je pouvais aussi utiliser taskkill //F //IM node.exe. Je ne sais pas pourquoi les deux -et //fonctionnent dans ce contexte. J'espère que cela t'aides!


Cela est dû à la tâche elle-même. Vous tuez les processus eux-mêmes. De plus, un seul / est suffisant.
Paul Stelian

2

Comme le processus est un objet global, vous n'avez pas besoin d'importer de module. La fonction suivante quitte ou tue le processus de nœud actuel.

process.exit (code)

process.kill (process.pid)

process.abort ()


1

Ouvrez le terminal de ligne de commande sur lequel s'exécute l'application de noeud et appuyez sur Ctrl + C

si vous voulez quitter une application node js du code,

process.exit(); // graceful termination 
process.exit(1); // non graceful termination 

0

si vous voulez quitter l'application node js, écrivez

process.exit(1)

dans votre code


3
1 est utilisé pour indiquer qu'il y a eu une erreur dans l'application, ce que les autres réponses clarifient déjà.
Herick

0

La sortie dans le noeud js se fait de deux manières:

  • Appel explicite de process.exit () .
  • Ou, si la boucle d'événements nodejs est effectuée avec toutes les tâches et qu'il n'y a plus rien à faire. Ensuite, l'application de noeud se fermera automatiquement.

Comment ça fonctionne?

Si vous souhaitez forcer la boucle d'exécution à arrêter le processus, vous pouvez utiliser le processus de variable globale qui est une instance d' EventEmitter . Ainsi, lorsque vous appelez process.exit (), vous émettez en fait l' événement exit qui met fin à toutes les tâches immédiatement même s'il n'y a toujours pas d'opérations asynchrones.

process.exit () prend un code de sortie (Integer) comme paramètre. Le code 0 est la valeur par défaut et cela signifie qu'il se termine avec un «succès». Alors que le code 1 signifie qu'il se termine avec un «échec».


0

Si vous êtes sous Windows, allez dans le Gestionnaire des tâches, puis allez dans Processus, recherchez un processus appelé "nœud", puis cliquez dessus avec le bouton droit de votre souris puis cliquez sur l'option "Terminer le processus".


-1

Vous pouvez utiliser la fonction process.exit ([code]) .

Si vous souhaitez quitter sans «échec», vous utilisez le code 0:

process.exit(0);

Pour quitter avec un code «échec», 1vous pouvez exécuter:

process.exit(1);

Le code «échec» de l'échec est spécifique à l'application. Vous pouvez donc utiliser vos propres conventions pour cela.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.