Je suis le guide ici (écoute des événements SIGINT) pour arrêter gracieusement mon application node.js hébergée par Windows-8 en réponse à Ctrl-C ou à l'arrêt du serveur.
Mais Windows n'a pas SIGINT
. J'ai également essayé process.on('exit')
, mais cela semble tardif pour faire quoi que ce soit de productif.
Sous Windows, ce code me donne: Erreur: aucun module de ce type
process.on( 'SIGINT', function() {
console.log( "\ngracefully shutting down from SIGINT (Crtl-C)" )
// wish this worked on Windows
process.exit( )
})
Sous Windows, ce code s'exécute, mais il est trop tard pour faire quelque chose de gracieux :
process.on( 'exit', function() {
console.log( "never see this log message" )
})
Existe-t-il un SIGINT
événement équivalent sous Windows?
Vous devez utiliser le module readline et écouter un événement 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();
});
Sauf si vous avez besoin de l'importation "readline" pour d'autres tâches, je vous suggère d'importer "readline" une fois que le programme a vérifié qu'il fonctionne sur Windows. De plus, pour ceux qui ne le savent peut-être pas, cela fonctionne sur les systèmes Windows 32 bits et Windows 64 bits (qui renverront le mot clé "win32"). Merci pour cette solution 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();
});
Actuellement, il n'y a toujours pas de prise en charge dans le nœud pour capturer les événements de contrôle de la console Windows, il n'y a donc pas d'équivalents aux signaux POSIX:
https://github.com/joyent/node/issues/155
Cependant, la documentation du module tty donne un exemple de mécanisme pour capturer les pressions de touches afin d'initier un arrêt progressif, mais cela ne fonctionne que pour 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();
}
});
De nos jours cela fonctionne juste sur toutes les plateformes , y compris Windows.
Le code suivant se connecte puis se termine correctement sur Windows 10:
process.on('SIGINT', () => {
console.log("Terminating...");
process.exit(0);
});
Depuis node.js 0.8, l'événement keypress
n'existe plus. Il existe cependant un package npm appelé keypress qui réimplémente l'événement.
Installer avec npm install keypress
, puis faites quelque chose comme:
// 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");
}
});
}