Quelle est la commande utilisée pour quitter? (c'est-à-dire terminer le processus Node.js)
Quelle est la commande utilisée pour quitter? (c'est-à-dire terminer le processus Node.js)
Réponses:
Appelez la méthode de process
l'objet global exit
:
process.exit()
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
.
exit
n'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.
mod_php
ou 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.
process.exit()
n'est pas recommandé , comme décrit dans cette réponse ci-dessous .
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 versprocess.stdout
etprocess.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. Laprocess.exitCode
proprié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 lastdout
troncature 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'appelprocess.exit()
, cependant, force le processus à se terminer avant que ces écritures supplémentairesstdout
puissent être effectuées.Plutôt que d'appeler
process.exit()
directement, le code devrait définir leprocess.exitCode
et 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; }
process.exit()
est prévu.
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);
code = 0; process.exit(code);
code
?
process.exit()
sans paramètre car le code par défaut est 0
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.js
vs node exit_0.js
(vous pouvez vérifier en faisant node exit_1.js
puis en faisant echo $?
).
Si vous êtes dans un terminal Unix ou une ligne de commande Windows et que vous souhaitez quitter le Node REPL, soit ...
.exit
et appuyez sur Entrée, ounode
REPL, Ctrl + D pour quitter est un comportement standard, donc cela fonctionne également sur Windows.
A partir de la ligne de commande, .exit
c'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])
.
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 versprocess.stdout
etprocess.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. Laprocess.exitCode
proprié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()
:
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.exitCode
pour renvoyer n'importe quel résultat au processus d'appel.
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.
Il vaut toujours mieux throw
une 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é.
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')
REPL (ligne de commande)
Appuyez ctrl + c
deux fois
Tapez .exit
et 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
J'ai une application que je voulais:
J'ai dû me connecter process.exit(code)
à un exit
gestionnaire 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); });
process.exitCode
au 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.
process.exitCode = 1
, le processus se
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");
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
À partir du code, vous pouvez utiliser process.exit([errorcode])
où [errorcode]
est un entier facultatif ( 0
c'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
node --version
v0.10.18
Appuyez Ctrl + C
deux fois sur ou .exit
.
>
(To exit, press ^C again or type .exit)
>
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!
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 ()
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
si vous voulez quitter l'application node js, écrivez
process.exit(1)
dans votre code
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».
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".
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», 1
vous 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.
end()
la demander également. Sinon, ça va juste se bloquer.