Come uscire in Node.js


1868

Qual è il comando utilizzato per uscire? (ovvero, termina il processo Node.js)

Risposte:


2376

Chiama il metodo processdell'oggetto globale exit:

process.exit()

Dai documenti:

process.exit ([code])

Termina il processo con il specificato code. Se omesso, exit utilizza il codice "successo" 0.

Per uscire con un codice "non riuscito":

process.exit(1);

La shell che ha eseguito il nodo dovrebbe vedere il codice di uscita come 1.


5
Voglio solo aggiungere qualcosa. Se stai gestendo una richiesta, dovresti anche farlo end(). Altrimenti, si bloccherà e basta.
pixelfreak

126
@pixelfreak, exitnon è affatto fuorviante. Sei confuso su come funziona Node. Pensa a Node come al server stesso. Non è solo avviato come necessario, come PHP è all'interno di un server web come Apache. Nodo non ha nemmeno nulla a che fare con i server Web! È solo un host per alcuni JavaScript, con alcune belle librerie integrate per fare cose utili.
Brad,

6
@Brad e PHP è un linguaggio generico. Non è necessario eseguirlo mod_phpo utilizzare Apache. Puoi reimplementare un httpd in PHP come fa il nodo se vuoi davvero o usare un approccio più sano / standardizzato come FastCGI proprio come puoi fare nel nodo.
binki,

38
Si prega di notare che nonprocess.exit() è raccomandato , come descritto nella seguente risposta .
AndreasPizsa,

410

Solo una nota che l'uso nonprocess.exit([number]) è una pratica consigliata .

La chiamata process.exit()costringerà il processo a terminare il più rapidamente possibile anche se sono ancora in corso operazioni asincrone non ancora completate, comprese le operazioni di I / O su process.stdouteprocess.stderr .

Nella maggior parte dei casi, non è effettivamente necessario chiamare process.exit()esplicitamente. Il processo Node.js si chiuderà da solo se non è presente alcun lavoro aggiuntivo nel loop degli eventi. Il process.exitCode proprietà può essere impostata per indicare al processo quale codice di uscita utilizzare quando il processo viene chiuso correttamente.

Ad esempio, il seguente esempio illustra a uso improprio del process.exit()metodo che potrebbe portare alla stdouttroncatura e alla perdita dei dati stampati :

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

Il motivo per cui questo è problematico è perché le scritture process.stdoutin Node.js sono talvolta asincrone e possono verificarsi su più tick del ciclo di eventi Node.js. La chiamata process.exit(), tuttavia, impone la chiusura del processo prima di quelle scritture aggiuntivestdout possano essere eseguite .

Invece di chiamare process.exit()direttamente, il codice dovrebbe impostare il process.exitCodee consentire al processo di uscire naturalmente evitando la pianificazione di qualsiasi lavoro aggiuntivo per il ciclo degli eventi:

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

31
Questa è di gran lunga la risposta migliore. Altre risposte potrebbero non consentire al nodo di elaborare correttamente gli eventi in sospeso prima dell'uscita, molto triste :(
djabraham,

3
D'accordo, questo dovrebbe avere più voti! Avevo uno script del nodo che stava dando il via a più processi figlio tramite shelljs.exec e volevo che il mio script generale tornasse con un codice di uscita dell'errore se uno qualsiasi dei processi figlio falliva. process.exitCode = 1 ha funzionato alla grande nei callback di exec (mentre semplicemente chiamando process.exit (1) lì usciva dallo script principale prima che tutti i processi figlio finissero!)
Nick,

15
Ho usato questa risposta e ho scoperto che il mio processo non è mai realmente uscito. Ho dovuto ctrl-C esso.
jcollum,

34
Esistono molti casi d'uso per il processo immediato e la chiusura dell'evento in sospeso. Questo è esattamente ciò a cui process.exit()è destinato.
Dominic Cerisano,

7
Questa non è la migliore risposta da nessuna parte perché non risponde alla domanda. Fornisce invece le migliori pratiche su come sviluppare il flusso di codice per un programma nodejs.
anon58192932

365

Dalla documentazione ufficiale di nodejs.org :

process.exit(code)

Termina il processo con il codice specificato. Se omesso, exit utilizza il codice "esito positivo" 0.

Per uscire con un codice "non riuscito":

process.exit(1);

9
@Alison sì, o più precisamentecode = 0; process.exit(code);
wprl

7
È vero che se stai uscendo, probabilmente non ti interessa il valore di code?
Armand,

8
@Alison Un'idea migliore è process.exit()senza parametri poiché il codice predefinito è 0
Jeremy Moritz

2
@Armand Hai ragione: il codice è solo una variabile e in questo caso viene utilizzato per indicare quale sia il parametro. Quindi .exit (0) fa tutto ciò che fa l'esempio.
Gerard ONeill,

23
@Armand il codice non fa per te, è per qualunque cosa abbia eseguito il tuo codice. Ad esempio, se crei un exit_0.js con process.exit(0);ed eseguilo con node exit_0.js && echo 'success'esso, dirà "successo". Se si crea exit_1.js con process.exit(1);ed eseguirlo, node exit_1.js && echo 'success'non verrà indicato "esito positivo" poiché il processo è terminato con un valore diverso da zero (che indica un "errore" o "uscita anomala" nella shell). Inoltre, vedrai valori diversi $?se corri node exit_1.jsvs node exit_0.js(puoi controllare facendo node exit_1.jse poi facendo echo $?).
msouth,

277

Se ci si trova in un terminale Unix o nella riga di comando di Windows e si desidera uscire dal REPL del nodo, o ...

  • Premi Ctrl+C due volte o
  • digitare .exite premere Invio, oppure
  • premi Ctrl+ Dall'inizio di una riga (solo Unix)

14
Nota che, oltre a Node, il collegamento Ctrl + D su Mac o Linux funziona su quasi tutte le shell e REPL che incontrerai mai, comprese le shell Unix come Bash, le shell per database come MySQL e PostgreSQL e le REPL per linguaggi di programmazione come Python, PHP e Ruby. È l'unico metodo per uscire dalle shell che io abbia mai usato.
Mark Amery,

2
Per nodeREPL, Ctrl + D per uscire è un comportamento standard, quindi funziona anche su Windows.
Alan,

Premi Ctrl + C (anche su un Mac!)
Prince,

124

Dalla riga di comando, .exitè quello che vuoi:

$ node
> .exit
$

È documentato nei documenti REPL . REPL (Read-Eval-Print-Loop) è il nome della riga di comando del nodo.

Da un normale programma, utilizzare process.exit([code]).


79

Dipende dal motivo per cui sei disposto a uscire dal processo node.js, ma in ogni caso process.exit()è l' ultima opzione da considerare . Una citazione dalla documentazione:

È importante notare che la chiamata process.exit()costringerà il processo a terminare il più rapidamente possibile anche se sono ancora in corso operazioni asincrone non ancora completate, comprese le operazioni di I / O su process.stdoute process.stderr.

Nella maggior parte dei casi, non è effettivamente necessario chiamare process.exit()esplicitamente. Il processo Node.js si chiuderà da solo se non è presente alcun lavoro aggiuntivo nel loop degli eventi. La process.exitCodeproprietà può essere impostata per indicare al processo quale codice di uscita utilizzare quando il processo viene chiuso correttamente.

Copriamo i possibili motivi per cui potresti voler uscire dal processo node.js e perché dovresti evitarlo process.exit() :

Caso 1 - Esecuzione completata (script della riga di comando)

Se lo script ha raggiunto la fine e l'interprete del nodo non viene chiuso, indica che alcune operazioni asincrone sono ancora in sospeso. A process.exit()questo punto è sbagliato forzare la chiusura del processo . È meglio cercare di capire cosa impedisce alla tua sceneggiatura di uscire nel modo previsto . E quando lo risolvi, puoi usare process.exitCodeper restituire qualsiasi risultato al processo di chiamata.

Caso 2 - Terminazione a causa del segnale esterno (SIGINT / SIGTERM / altro)

Ad esempio, se sei disposto a chiudere con grazia un'app express . A differenza dello script da riga di comando, l'app express continua a funzionare all'infinito, in attesa di nuove richieste. process.exit()sarà una cattiva opzione qui perché interromperà tutte le richieste che sono in corso. E alcuni di loro potrebbero essere non idempotenti (AGGIORNAMENTO, ELIMINA). Il client non saprà mai se tali richieste sono state completate o meno sul lato server e potrebbe essere il motivo dell'incoerenza dei dati tra client e server. L'unica buona soluzione è dire al server http di smettere di accettare nuove richieste e attendere che quelle in sospeso finiscano con 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");
   });
});

Se il problema persiste, consultare il caso 1.

Caso 3 - Errore interno

È sempre meglio throwun errore, otterrai una traccia dello stack e un messaggio di errore ben formattati. I livelli superiori di codice possono sempre decidere se possono gestire l'errore ( catch) o lasciarlo arrestare il processo. D'altra parte, process.exit(1)terminerà il processo in silenzio e non ci sarà alcuna possibilità di recuperare da questo. Potrebbe essere l'unico "vantaggio" di process.exit(), si può essere sicuri che il processo verrà terminato.


4
Risposta incredibile. Process.exit()sembra eccessivo per la maggior parte delle applicazioni. Stavo cercando un equivalente della funzione die () di php ... più simile a:throw new Error('die msg')
AvadData

Se uno ha un sacco di codice che dovrebbe essere eseguito continuamente fino a quando non viene ricevuta una richiesta di arresto, c'è qualche bella convenzione per la registrazione di eventi che consentirebbe di abbandonare gli abbonamenti in risposta a una richiesta di arresto, senza che ciò richieda il codice usando gli eventi o il codice che richiede l'arresto ha una conoscenza specifica l'uno dell'altro? Sfortunatamente, l'unico modo a cui riesco a pensare di implementare un po 'una specie che richiederebbe che qualsiasi pezzo di codice che registra un evento crei anche un wrapper che includa una chiusura per annullare la registrazione.
supercat

26

REPL (riga di comando)

  • Premi ctrl + c due volte

  • Digita .exite premi Invio

File di script

process.exit(code)

Il nodo normalmente esce con il codice 0 quando non sono in sospeso altre operazioni asincrone.

process.exit(1) dovrebbe essere usato per uscire con un codice di errore. Questo ci permetterà di dedurre che il nodo non si è chiuso con grazia ed è stato costretto a chiudere.

Ci sono altri codici di uscita come

3 - Errore di analisi JavaScript interno (molto molto raro)

5 - Errore irreversibile nel motore javascript v8

9 - Argomento non valido

Per l'elenco completo vedere i codici di uscita del nodo


12

Ho un'applicazione che volevo:

  1. Invia una e-mail all'utente
  2. Esci con un codice di errore

Ho dovuto collegarmi process.exit(code)a un exitgestore di eventi, altrimenti la posta non verrà inviata poiché la chiamata process.exit(code)uccide direttamente gli eventi asincroni.

#!/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
Penso che tu voglia process.exitCode
Julian de Bhal,

Per la cronaca: ho trascorso una buona parte della giornata cercando di mettermi process.exitCodeal lavoro per me in uno strumento da riga di comando che sto costruendo (testato su Node v4.3.0). Ma non riuscivo a farlo funzionare come documentato. Questo molto bene avrebbe potuto essere un caso marginale con commander- sebbene github.com/tj/commander.js/… mi faccia meravigliare. Non sono sicuro se qualcun altro ha visto questo problema con il nodo 4, ma documentando per ogni evenienza riferimenti futuri.
mikermcneil,

Per quanto riguarda la possibilità che ciò provenga dal comandante, ho anche esaminato il suo unico dep ( github.com/zhiyelee/graceful-readlink/… ) ma nessun dado. L'unico possibile colpevole sembra forse: github.com/tj/commander.js/blob/… In particolare, il problema è che, anche se impostato process.exitCode = 1, il processo termina con il codice 0.
mikermcneil,

11

Come ha sottolineato @Dominic, lanciare un errore non rilevato è una pratica migliore invece di chiamare process.exit ([codice]) :
process.exitCode = 1; throw new Error("my module xx condition failed");


3
Preso nel contesto della domanda "Come uscire da Node.js", questo è un consiglio orribile. Il tuo suggerimento avrebbe molto più senso se la domanda chiedesse specificamente come uscire dall'errore. Consiglio vivamente di esprimere la propria risposta in modo tale da indicare che l'utente fa come suggerito, solo se sta tentando di uscire dall'applicazione in caso di errore .
rstackhouse,

@rstackhouse, spero che tu abbia passato un errore non rilevato
MANN il

5
Il problema del lancio è la brutta traccia dell'inferno. Qualche suggerimento per evitare questa traccia dello stack (non rilevante quando lo strumento CLI vuole uscire se l'uso non è corretto)?
MoOx,

9

Uscire

let exitCode = 1;
process.exit(exitCode)

Codici di uscita utili

1 - Catchall per errori generali
2 - Uso improprio dei builtin della shell (secondo la documentazione di Bash)
126 - Il comando richiamato non può essere eseguito
127 - "comando non trovato"
128 - Argomento non valido per uscire
128 + n - Segnale di errore irreversibile “n”
130 - Script terminato da Control-C
255 \ * - Esci dallo stato fuori intervallo

Potresti aggiornare la tua risposta, nodejs.org/api/process.html#process_process_exit_code
Cmag

7

Dal codice è possibile utilizzare process.exit([errorcode])dove [errorcode]è un numero intero opzionale ( 0è l'impostazione predefinita per indicare il successo).

Se si utilizza Read Eval Print Loop (REPL) , è possibile utilizzare Ctrl+ Do digitare.exit

In alternativa, su Windows o Linux puoi usare Ctrl+ C, Ctrl+C

Su Mac il comando è Ctrl+ Z, Ctrl+Z


2
Due controlli c funzionano anche sul Mac, almeno sul mio con node --version v0.10.18
msouth

Control-C non sembra annullare le operazioni già programmate, mentre ctrl-z termina il processo senza indugio, su Mac.
jorisw,

7

Premere Ctrl + Cdue volte o .exit.

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

3

Sono stato in grado di far morire tutti i processi del mio nodo direttamente dalla shell Git Bash su Windows 10 digitando taskkill -F -IM node.exe: questo termina tutti i processi del nodo sul mio computer contemporaneamente. Ho scoperto che potrei anche usare taskkill //F //IM node.exe. Non so perché entrambi -e //funzionano in questo contesto. Spero che sia di aiuto!


Ciò è dovuto alla taskkill stessa. Stai uccidendo i processi stessi. Inoltre, è sufficiente un singolo /.
Paul Stelian,

2

Poiché il processo è un oggetto globale, non è necessario importare alcun modulo. La seguente funzione termina o interrompe il processo nodo corrente.

process.exit (codice)

Process.Kill (process.pid)

process.abort ()


1

Aprire il terminale della riga di comando in cui è in esecuzione l'applicazione del nodo e premere Ctrl + C

se vuoi uscire da un'applicazione js del nodo dal codice,

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

0

se si desidera uscire dall'applicazione js del nodo, scrivere

process.exit(1)

nel tuo codice


3
1 è usato per indicare che c'è stato un errore nell'applicazione, che le altre risposte già chiariscono.
Herick,

0

L'uscita nel nodo js viene eseguita in due modi:

  • Chiamare process.exit () esplicitamente.
  • Oppure, se il ciclo di eventi nodejs viene eseguito con tutte le attività e non è rimasto nulla da fare. Quindi, l'applicazione nodo verrà automaticamente chiusa.

Come funziona?

Se si desidera forzare il ciclo di esecuzione per arrestare il processo, è possibile utilizzare il processo variabile globale che è un'istanza di EventEmitter . Quindi quando chiami process.exit () in realtà emetti l' evento di uscita che termina immediatamente tutte le attività anche se non ci sono ancora operazioni asincrone.

process.exit () accetta un codice di uscita (intero) come parametro. Il codice 0 è il valore predefinito e questo significa che esce con un "successo". Mentre il codice 1 significa che esce con un 'fallimento'.


0

Se sei in Windows, vai a Task Manager, quindi vai a Processi, cerca un processo chiamato "nodo", quindi fai clic su di esso con il tasto destro del mouse e quindi fai clic sull'opzione "Termina processo".


-1

È possibile utilizzare la funzione process.exit ([code]) .

Se si desidera uscire senza un "errore", utilizzare il codice 0:

process.exit(0);

Per uscire con un codice di "errore" 1è possibile eseguire:

process.exit(1);

Il codice "fallimento" dell'errore è specifico dell'applicazione. Quindi puoi usare le tue convenzioni per questo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.