Qual è il comando utilizzato per uscire? (ovvero, termina il processo Node.js)
Qual è il comando utilizzato per uscire? (ovvero, termina il processo Node.js)
Risposte:
Chiama il metodo process
dell'oggetto globale exit
:
process.exit()
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
.
exit
non è 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.
mod_php
o 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.
process.exit()
è raccomandato , come descritto nella seguente risposta .
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 suprocess.stdout
eprocess.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. Ilprocess.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 allastdout
troncatura 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.stdout
in Node.js sono talvolta asincrone e possono verificarsi su più tick del ciclo di eventi Node.js. La chiamataprocess.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 ilprocess.exitCode
e 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; }
process.exit()
è destinato.
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);
code = 0; process.exit(code);
code
?
process.exit()
senza parametri poiché il codice predefinito è 0
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.js
vs node exit_0.js
(puoi controllare facendo node exit_1.js
e poi facendo echo $?
).
Se ci si trova in un terminale Unix o nella riga di comando di Windows e si desidera uscire dal REPL del nodo, o ...
.exit
e premere Invio, oppurenode
REPL, Ctrl + D per uscire è un comportamento standard, quindi funziona anche su Windows.
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])
.
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 suprocess.stdout
eprocess.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. Laprocess.exitCode
proprietà 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()
:
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.exitCode
per restituire qualsiasi risultato al processo di chiamata.
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.
È sempre meglio throw
un 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.
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')
REPL (riga di comando)
Premi ctrl + c
due volte
Digita .exit
e 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
Ho un'applicazione che volevo:
Ho dovuto collegarmi process.exit(code)
a un exit
gestore 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); });
process.exitCode
al 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.
process.exitCode = 1
, il processo termina con il codice 0.
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");
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
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
node --version
v0.10.18
Premere Ctrl + C
due volte o .exit
.
>
(To exit, press ^C again or type .exit)
>
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!
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 ()
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
se si desidera uscire dall'applicazione js del nodo, scrivere
process.exit(1)
nel tuo codice
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'.
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".
È 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.
end()
. Altrimenti, si bloccherà e basta.