Cómo salir en Node.js


1868

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

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.


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;
}

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);

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)

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


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á.


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


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); });

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");


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

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


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)
> 

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!


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 ()


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 

0

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

process.exit(1)

en tu código


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'.


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".


-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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.