Cómo salir en Node.js

1868

¿Cuál es el comando que se usa para salir? (es decir, finalizar el proceso Node.js)

Bryan Field
fuente

Respuestas:

2376

Llame al método processdel objeto global exit:

process.exit()

De los documentos:

proceso.exit ([código])

Finaliza el proceso con el especificado code. Si se omite, exit usa el código de "éxito" 0.

Para salir con un código de 'falla':

process.exit(1);

El shell que ejecutó el nodo debería ver el código de salida como 1.

Pero P.
fuente
55
Solo quiero agregar algo. Si está manejando una solicitud, también debe hacerlo end(). De lo contrario, simplemente se colgará.
pixelfreak
126
@pixelfreak, exitno es engañoso en absoluto. Estás confundido acerca de cómo funciona Node. Piense en Node como el servidor en sí. No solo se activa según sea necesario, como PHP está dentro de un servidor web como Apache. ¡Node ni siquiera tiene que tener nada que ver con los servidores web! Es solo un host para algunos JavaScript, con algunas geniales bibliotecas integradas para hacer cosas útiles.
Brad
66
@Brad y PHP es un lenguaje de propósito general. No es necesario ejecutarlo mod_phpni usar Apache. Puede volver a implementar un httpd en PHP como lo hace el nodo si realmente desea o utilizar un enfoque más sensato / estandarizado como FastCGI tal como puede hacerlo en el nodo.
binki
38
Tenga en cuenta que process.exit()se no se recomienda , como se describe en esta respuesta a continuación .
AndreasPizsa
410

Solo una nota de que el uso noprocess.exit([number]) es una práctica recomendada .

Las llamadas process.exit()obligarán al proceso a salir lo más rápido posible, incluso si todavía hay operaciones asincrónicas pendientes que aún no se han completado por completo, incluidas las operaciones de E / S hacia process.stdouty process.stderr.

En la mayoría de las situaciones, no es realmente necesario llamar process.exit()explícitamente. El proceso Node.js se cerrará solo si no hay trabajo adicional pendiente en el bucle de eventos. La process.exitCodepropiedad se puede configurar para decirle al proceso qué código de salida usar cuando el proceso finalice correctamente.

Por ejemplo, el siguiente ejemplo ilustra un mal uso del process.exit()método que podría llevar a que los datos impresos stdoutse truncaran y perdieran:

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

La razón por la que esto es problemático es porque las escrituras process.stdouten Node.js a veces son asíncronas y pueden ocurrir en múltiples ticks del bucle de eventos Node.js. process.exit()Sin embargo, la llamada obliga al proceso a salir antes de que stdoutse puedan realizar esas escrituras adicionales .

En lugar de llamar process.exit()directamente, el código debe establecer process.exitCodey permitir que el proceso salga de forma natural al evitar programar cualquier trabajo adicional para el bucle de eventos:

// How to properly set the exit code while letting
// the process exit gracefully.
if (someConditionNotMet()) {
  printUsageToStdout();  
  process.exitCode = 1;
}
Dominic
fuente
31
Esta es la mejor respuesta, de lejos. Es posible que otras respuestas no permitan que el nodo procese correctamente los eventos pendientes antes de la salida, muy triste :(
djabraham
3
De acuerdo, ¡esto debería tener más votos a favor! Tenía un script de nodo que iniciaba múltiples procesos secundarios a través de shelljs.exec y quería que mi script general regresara con un código de salida de error si alguno de los procesos secundarios fallaba. process.exitCode = 1 funcionó muy bien en las devoluciones de llamada ejecutivas (mientras que simplemente llamar a process.exit (1) allí saldría del script principal antes de que finalizaran todos los procesos secundarios)
Nick
15
Utilicé esta respuesta y descubrí que mi proceso nunca salió realmente. Tuve que controlarlo.
jcollum
34
Hay muchos casos de uso para el proceso inmediato y la terminación de eventos pendientes. Eso es exactamente para lo que process.exit()está destinado.
Dominic Cerisano
77
Esta no es la mejor respuesta de ninguna manera porque no responde la pregunta. En cambio, ofrece las mejores prácticas sobre cómo desarrollar el flujo de código para un programa nodejs.
anon58192932
365

De la documentación oficial de nodejs.org :

process.exit(code)

Finaliza el proceso con el código especificado. Si se omite, exit usa el código de 'éxito' 0.

Para salir con un código de 'falla':

process.exit(1);
alienhard
fuente
99
@Alison sí, o más precisamentecode = 0; process.exit(code);
wprl
77
¿Es cierto que si sales, probablemente no te importe el valor de code?
Armand
8
@Alison Una mejor idea es simplemente process.exit()sin parámetros ya que el código predeterminado es 0
Jeremy Moritz
2
@Armand Tienes razón: el código es solo una variable y, en este caso, se utiliza para indicar cuál es el parámetro. Entonces .exit (0) hace todo lo que hace el ejemplo.
Gerard ONeill
23
@Armand el código no es para ti, es para lo que sea que haya ejecutado tu código. Por ejemplo, si crea un exit_0.js con process.exit(0);y lo ejecuta node exit_0.js && echo 'success', dirá "éxito". Si crea exit_1.js con process.exit(1);y lo ejecuta node exit_1.js && echo 'success', no dirá "éxito" ya que su proceso salió con un valor distinto de cero (que indica un "error" o "salida anormal" al shell). Además, verá diferentes valores $?si ejecuta node exit_1.jsvs node exit_0.js(puede verificar haciendo node exit_1.jsy luego haciendo echo $?).
msouth
277

Si está en un terminal Unix o en la línea de comandos de Windows y desea salir del Node REPL, ...

  • Presione Ctrl+ Cdos veces, o
  • escriba .exity presione Entrar, o
  • presione Ctrl+ Dal comienzo de una línea (solo Unix)
Mohsen
fuente
14
Tenga en cuenta que, más allá de Node, el acceso directo Ctrl + D en Mac o Linux funciona en casi todos los shells y REPL que encontrará, incluidos los shells de Unix como Bash, los shells para bases de datos como MySQL y PostgreSQL, y los REPL para lenguajes de programación como Python, PHP y Ruby. Es el único método para salir de las conchas que uso.
Mark Amery
2
Para nodeREPL, Ctrl + D para salir es un comportamiento estándar, por lo que también funciona en Windows.
Alan
Presiona Ctrl + C (¡incluso en una Mac!)
Prince
124

Desde la línea de comandos, .exites lo que quieres:

$ node
> .exit
$

Está documentado en los documentos REPL . REPL (Read-Eval-Print-Loop) es lo que se llama la línea de comando Node.

Desde un programa normal, use process.exit([code]).

Mike M. Lin
fuente
79

Depende de la razón por la que está dispuesto a salir del proceso node.js, pero en cualquier caso process.exit()es la última opción a considerar . Una cita de la documentación:

Es importante tener en cuenta que las llamadas process.exit()obligarán al proceso a salir lo más rápido posible, incluso si todavía hay operaciones asíncronas pendientes que aún no se han completado por completo, incluidas las operaciones de E / S hacia process.stdouty process.stderr.

En la mayoría de las situaciones, en realidad no es necesario llamar process.exit()explícitamente. El proceso Node.js se cerrará solo si no hay trabajo adicional pendiente en el bucle de eventos. La process.exitCodepropiedad se puede configurar para decirle al proceso qué código de salida usar cuando el proceso finalice correctamente.

Cubramos las posibles razones por las que podría estar dispuesto a salir del proceso node.js y por qué debería evitar process.exit():

Caso 1 - Ejecución completa (script de línea de comando)

Si el script ha llegado a su fin y el intérprete de nodo no sale, indica que algunas operaciones asíncronas aún están pendientes. Es incorrecto forzar la finalización del proceso process.exit()en este momento. Es mejor tratar de entender qué impide que su script salga de la manera esperada . Y cuando resuelva esto, puede usar process.exitCodepara devolver cualquier resultado al proceso de llamada.

Caso 2 - Terminación debido a señal externa (SIGINT / SIGTERM / other)

Por ejemplo, si está dispuesto a cerrar con gracia una aplicación express . A diferencia del script de línea de comandos, la aplicación express sigue ejecutándose infinitamente, esperando nuevas solicitudes. process.exit()será una mala opción aquí porque va a interrumpir todas las solicitudes que están en proceso. Y algunos de ellos pueden ser no idempotentes (ACTUALIZAR, ELIMINAR). El cliente nunca sabrá si esas solicitudes se han completado o no en el lado del servidor y podría ser la razón de la inconsistencia de datos entre el cliente y el servidor. La única buena solución es decirle al servidor http que deje de aceptar nuevas solicitudes y espere a que las pendientes terminen 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");
   });
});

Si aún no sale, vea el Caso 1.

Caso 3 - Error interno

Siempre es mejor throwun error, obtendrá un seguimiento de pila y un mensaje de error bien formateados. Los niveles superiores de código siempre pueden decidir si pueden manejar el error ( catch) o dejar que bloquee el proceso. Por otro lado, process.exit(1)finalizará el proceso en silencio y no habrá posibilidad de recuperarse de esto. Puede ser el único "beneficio" de process.exit(), puede estar seguro de que el proceso finalizará.

teq
fuente
44
Increíble respuesta. Process.exit()parece una exageración importante para la mayoría de las aplicaciones. Estaba buscando un equivalente a la función die () de php ... más como:throw new Error('die msg')
AvadData
Si uno tiene un montón de código que se supone que debe ejecutarse continuamente hasta que se reciba una solicitud de cierre, ¿existe alguna convención agradable para registrar eventos que permita que se abandonen las suscripciones en respuesta a una solicitud de cierre, sin que eso requiera que el código use los eventos? o el código que solicita el cierre tiene un conocimiento específico el uno del otro? Desafortunadamente, la única forma en que puedo pensar para implementar algo así sería requerir que cualquier pieza de código que registre un evento también cree un contenedor que incluya un cierre para anular el registro.
supercat
26

REPL (línea de comando)

  • Presione ctrl + c dos veces

  • Escribe .exity presiona enter

Archivo de comandos

process.exit(code)

El nodo normalmente sale con el código 0 cuando no hay más operaciones asíncronas pendientes.

process.exit(1) debe usarse para salir con un código de falla. Esto nos permitirá inferir que el nodo no se cerró correctamente y se vio obligado a cerrar.

Hay otros códigos de salida como

3 - Error interno de análisis de JavaScript (muy, muy raro)

5 - Error grave en el motor v8 javascript

9 - Argumento inválido

Para la lista completa, vea los códigos de salida de nodo

Siva Prakash
fuente
12

Tengo una aplicación que quería:

  1. Enviar un correo electrónico al usuario
  2. Salir con un código de error

Tuve que conectarme process.exit(code)a un exitcontrolador de eventos, o de lo contrario el correo no se enviará ya que llamar process.exit(code)directamente mata los eventos asincrónicos.

#!/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
fuente
44
Creo que quieres process.exitCode
Julian de Bhal
Para el registro: pasé una buena parte del día tratando de process.exitCodetrabajar para mí en una herramienta de línea de comandos que estoy construyendo (probado en el Nodo v4.3.0). Pero no pude hacer que se comportara como está documentado. Esto podría haber sido un caso extremo commander, aunque github.com/tj/commander.js/… me hace preguntarme. No estoy seguro de si alguien más ha visto este problema con el Nodo 4, pero documenta por si acaso para futuras referencias.
mikermcneil
En cuanto a la posibilidad de que esto venga del comandante, también miré su único dep ( github.com/zhiyelee/graceful-readlink/… ) pero sin dados. El único culpable posible parece ser tal vez: github.com/tj/commander.js/blob/… Específicamente, el problema es que, incluso si configura process.exitCode = 1, el proceso sale con el código 0.
mikermcneil
11

Como señaló @Dominic, lanzar un error no detectado es una mejor práctica en lugar de llamar a process.exit ([código]) :
process.exitCode = 1; throw new Error("my module xx condition failed");

MANN
fuente
3
Tomado en el contexto de la pregunta "Cómo salir en Node.js", este es un consejo horrible. Su sugerencia tendría mucho más sentido si la pregunta preguntara específicamente cómo salir por error. Le sugiero que exprese su respuesta de tal manera que indique que el usuario hace lo que le sugiere, solo si está tratando de salir de la aplicación en caso de un error .
rstackhouse
@rstackhouse, espero que hayas pasado por un error no detectado que apunta a -> nodejs.org/api/process.html#process_process_exit_code
MANN
55
El problema con el lanzamiento es el rastro de pila feo como el infierno. ¿Algún consejo para evitar este seguimiento de la pila (no relevante cuando la herramienta CLI quiere salir si el uso no es correcto)?
MoOx
9

Salir

let exitCode = 1;
process.exit(exitCode)

Códigos de salida útiles

1 - Catchall para errores generales
2 - Uso indebido de los componentes integrados de shell (de acuerdo con la documentación de Bash)
126 - El comando invocado no puede ejecutarse
127 - "comando no encontrado"
128 - Argumento no válido para salir
128 + n - Señal de error fatal "n"
130 - Script terminado por Control-C
255 \ * - Estado de salida fuera de rango
Denis Lisitskiy
fuente
Considere actualizar su respuesta, nodejs.org/api/process.html#process_process_exit_code
Cmag
7

Desde el código puede usar process.exit([errorcode])where [errorcode]es un número entero opcional ( 0es el valor predeterminado para indicar el éxito).

Si usa el bucle de lectura, evaluación, impresión (REPL) , puede usar Ctrl+ Do escribir.exit

Alternativamente, en Windows o Linux puede usar Ctrl+ C, Ctrl+C

En Mac, el comando es Ctrl+ Z, Ctrl+Z

zzzzBov
fuente
2
Dos controles c también funcionan en la Mac, al menos en la mía con node --version v0.10.18
msouth
Control-C no parece cancelar las operaciones que ya estaban programadas, mientras que ctrl-z mata el proceso sin demora, en Mac.
jorisw
7

Presione Ctrl + Cdos veces o .exit.

> 
(To exit, press ^C again or type .exit)
> 
Cabeza y cola
fuente
3

Pude hacer que todos mis procesos de nodo se mueran directamente desde el shell Git Bash en Windows 10 escribiendo taskkill -F -IM node.exe: esto finaliza todos los procesos de nodo en mi computadora a la vez. Descubrí que también podía usar taskkill //F //IM node.exe. No estoy seguro de por qué tanto -y //trabajar en este contexto. ¡Espero que esto ayude!

Alison Stuart
fuente
Eso se debe a la tarea en sí misma. Estás matando los procesos ellos mismos. Además, un solo / es suficiente.
Paul Stelian
2

Como el proceso es un objeto global, no necesita importar ningún módulo. La siguiente función sale o mata el proceso del nodo actual.

proceso.exit (código)

process.kill (process.pid)

process.abort ()

sumit_suthar
fuente
1

Abra el terminal de línea de comando donde se ejecuta la aplicación de nodo y presione Ctrl + C

si desea salir de una aplicación de nodo js del código,

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

si desea salir de la aplicación del nodo js, ​​escriba

process.exit(1)

en tu código

Ajay Mudaliyar
fuente
3
1 se utiliza para indicar que ha habido un error en la aplicación, que las otras respuestas ya aclaran.
Herick
0

La salida en el nodo js se realiza de dos maneras:

  • Llamando a process.exit () explícitamente.
  • O, si el bucle de eventos de nodejs se realiza con todas las tareas, y no queda nada por hacer. Luego, la aplicación de nodo se cerrará automáticamente.

¿Cómo funciona?

Si desea forzar el ciclo de ejecución para detener el proceso, puede utilizar el proceso de variable global que es una instancia de EventEmitter . Entonces, cuando llama a process.exit () , en realidad emite el evento de salida que finaliza todas las tareas de inmediato, incluso si todavía no se han realizado operaciones asincrónicas.

process.exit () toma un código de salida (Integer) como parámetro. El código 0 es el predeterminado y esto significa que sale con un 'éxito'. Mientras que el código 1 significa que sale con una 'falla'.

majid jiji
fuente
0

Si está en Windows, vaya al Administrador de tareas, luego vaya a Procesos, busque un proceso llamado "nodo", luego haga clic en él con el botón derecho del mouse y luego haga clic en la opción "Finalizar proceso".

Albos Hajdari
fuente
-1

Puede usar la función process.exit ([código]) .

Si desea salir sin una 'falla', use el código 0:

process.exit(0);

Para salir con un código de 'falla' 1puede ejecutar:

process.exit(1);

El código de 'falla' de la falla es específico de la aplicación. Entonces puede usar sus propias convenciones para ello.

Oleksii Trekhleb
fuente