web-dev-qa-db-fra.com

Quel est l'équivalent Windows de process.on ('SIGINT') dans node.js?

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?

73
pappadog

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();
});
134
Gabriel Llamas

Je ne sais pas quand, mais sur le nœud 8.x et sur Windows 10, le code de question d'origine fonctionne simplement maintenant.

enter image description here

fonctionne également avec une invite de commande Windows.

14
Meirion Hughes

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

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();
  }
});
4
Pero P.

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);
});
4
Heinrich Ulbricht

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");
        }
    });
}
0
mekwall