Estoy siguiendo la guía aquí (escuchando SIGINT
eventos) para apagar correctamente mi aplicación node.js alojada en Windows-8 en respuesta a Ctrl+ Co al apagado del servidor.
Pero Windows no lo tiene SIGINT
. También lo intenté process.on('exit')
, pero parece demasiado tarde para hacer algo productivo.
En Windows, este código me da: Error: No existe tal módulo
process.on( 'SIGINT', function() {
console.log( "\ngracefully shutting down from SIGINT (Crtl-C)" )
// wish this worked on Windows
process.exit( )
})
En Windows, este código se ejecuta, pero es demasiado tarde para hacer algo elegante :
process.on( 'exit', function() {
console.log( "never see this log message" )
})
¿Existe un SIGINT
evento equivalente en Windows?
Respuestas:
Tienes que usar el módulo readline y escuchar un evento SIGINT:
http://nodejs.org/api/readline.html#readline_event_sigint
if (process.platform === "win32") { var rl = require("readline").createInterface({ input: process.stdin, output: process.stdout }); rl.on("SIGINT", function () { process.emit("SIGINT"); }); } process.on("SIGINT", function () { //graceful shutdown process.exit(); });
fuente
No estoy seguro de cuándo, pero en el nodo 8.xy en Windows 10, el código de pregunta original simplemente funciona ahora.
process.on( "SIGINT", function() { console.log( "\ngracefully shutting down from SIGINT (Crtl-C)" ); process.exit(); } ); process.on( "exit", function() { console.log( "never see this log message" ); } ); setInterval( () => console.log( "tick" ), 2500 );
también funciona con un símbolo del sistema de Windows.
fuente
A menos que necesite la importación "readline" para otras tareas, sugeriría importar "readline" una vez que el programa haya verificado que se está ejecutando en Windows. Además, para aquellos que no lo sepan, esto funciona tanto en sistemas Windows de 32 bits como en Windows de 64 bits (que devolverán la palabra clave "win32"). Gracias por esta solución Gabriel.
if (process.platform === "win32") { require("readline") .createInterface({ input: process.stdin, output: process.stdout }) .on("SIGINT", function () { process.emit("SIGINT"); }); } process.on("SIGINT", function () { // graceful shutdown process.exit(); });
fuente
Hoy en día solo funciona en todas las plataformas , incluido Windows.
El siguiente código se registra y luego termina correctamente en Windows 10:
process.on('SIGINT', () => { console.log("Terminating..."); process.exit(0); });
fuente
Actualmente todavía no hay soporte en el nodo para capturar los eventos de control de la consola de Windows, por lo que no hay equivalentes a las señales POSIX:
https://github.com/joyent/node/issues/1553
Sin embargo, la documentación del módulo tty da un ejemplo de un mecanismo para capturar las pulsaciones de teclas con el fin de iniciar un cierre ordenado, pero esto solo funciona para ctrl+ c.
var tty = require('tty'); process.stdin.resume(); tty.setRawMode(true); process.stdin.on('keypress', function(char, key) { if (key && key.ctrl && key.name == 'c') { console.log('graceful exit of process %d', process.pid); process.exit(); } });
fuente
Desde node.js 0.8, el
keypress
evento ya no existe. Sin embargo, existe un paquete npm llamado keypress que vuelve a implementar el evento.Instale con
npm install keypress
, luego haga algo como:// Windows doesn't use POSIX signals if (process.platform === "win32") { const keypress = require("keypress"); keypress(process.stdin); process.stdin.resume(); process.stdin.setRawMode(true); process.stdin.setEncoding("utf8"); process.stdin.on("keypress", function(char, key) { if (key && key.ctrl && key.name == "c") { // Behave like a SIGUSR2 process.emit("SIGUSR2"); } else if (key && key.ctrl && key.name == "r") { // Behave like a SIGHUP process.emit("SIGHUP"); } }); }
fuente