Quiero decirle a Node.js que siempre haga algo justo antes de salir, por cualquier razón, Ctrl+ C, una excepción o cualquier otra razón.
Intenté esto:
process.on('exit', function (){
console.log('Goodbye!');
});
Comencé el proceso, lo maté y no pasó nada. Lo comencé de nuevo, presioné Ctrl+ C, y todavía no pasó nada ...
Respuestas:
ACTUALIZAR:
Puede registrar un controlador para
process.on('exit')
y en cualquier otro caso (SIGINT
o excepción no controlada) para llamarprocess.exit()
fuente
must only
realizasynchronous
operaciones en elexit
controladorbeforeExit
evento en su lugar.stderr
mensaje en varios manejadores de limpieza. He escrito un módulo que hace todo esto, github.com/jtlapp/node-cleanup , originalmente basado en la solución cleanup.js a continuación, pero revisado en gran medida según los comentarios. Espero que sea útil.El siguiente script permite tener un único controlador para todas las condiciones de salida. Utiliza una función de devolución de llamada específica de la aplicación para realizar un código de limpieza personalizado.
cleanup.js
Este código intercepta excepciones no capturadas, Ctrl+ Cy eventos de salida normales. Luego llama a una única función opcional de devolución de llamada de limpieza del usuario antes de salir, manejando todas las condiciones de salida con un solo objeto.
El módulo simplemente extiende el objeto del proceso en lugar de definir otro emisor de eventos. Sin una devolución de llamada específica de la aplicación, la limpieza por defecto es una función no operativa. Esto fue suficiente para mi uso donde los procesos secundarios se dejaron en ejecución al salir por Ctrl+ C.
Puede agregar fácilmente otros eventos de salida, como SIGHUP, según lo desee. Nota: según el manual de NodeJS, SIGKILL no puede tener un oyente. El siguiente código de prueba muestra varias formas de usar cleanup.js
fuente
process.exit()
. Los controladores de limpieza ahora tienen la flexibilidad de comportarse como una función del código de salida o señal, y los controladores de limpieza se pueden desinstalar, según sea necesario para admitir la limpieza asincrónica o evitar la limpieza cíclica. Ahora tiene poco parecido con el código anterior.Esto atrapa todos los eventos de salida que puedo encontrar que se pueden manejar. Parece bastante confiable y limpio hasta ahora.
fuente
"salir" es un evento que se activa cuando el nodo finaliza su ciclo de eventos internamente, no se activa cuando finaliza el proceso externamente.
Lo que estás buscando es ejecutar algo en un SIGINT.
Los documentos en http://nodejs.org/api/process.html#process_signal_events dan un ejemplo:
Ejemplo de escuchar SIGINT:
Nota: esto parece interrumpir la señalización y deberá llamar a process.exit () cuando termine con su código.
fuente
kill -2
, pasará elSIGINT
código. Tenemos que hacerlo de esta manera porque tenemos registro de nodos en un archivo txt, por lo que Ctrl + C no es posible.fuente
Solo quería mencionar el
death
paquete aquí: https://github.com/jprichardson/node-deathEjemplo:
fuente
io.js tiene un
exit
y unbeforeExit
evento, que hacen lo que quieres.fuente
Aquí hay un buen truco para Windows
fuente
Después de jugar con otra respuesta, aquí está mi solución para esta tarea. La implementación de esta manera me ayuda a centralizar la limpieza en un solo lugar, evitando el doble manejo de la limpieza.
Para el propósito de demostración, este es un enlace a mi esencia. En el archivo, agrego un setTimeout para falsificar el proceso en ejecución.
Si corre
node node-exit-demo.js
y no hace nada, luego de 2 segundos, verá el registro:De lo contrario, si antes de que finalice el servicio, termina
ctrl+C
, verá:Lo que sucedió es que el proceso Node salió inicialmente con el código SIGINT, luego se enruta a process.exit () y finalmente salió con el código de salida 0.
fuente
En el caso donde el proceso fue generado por otro proceso de nodo, como:
E intentas matarlo más tarde, a través de:
Así es como manejas el evento [en el niño]:
fuente