Что такое Windows-эквивалент процесса.on ('SIGINT') в узле.Джей?


Я следую инструкциям здесь (прослушивание событий SIGINT), чтобы изящно завершить работу моего узла, размещенного в Windows-8.приложение js в ответ на Ctrl-C или завершение работы сервера.

но Windows не имеет SIGINT. Я тоже пробовал process.on('exit'), но это, кажется, поздно делать что-нибудь продуктивное.

на Windows, этот код дает мне: ошибка: Нет такого модуля

process.on( 'SIGINT', function() {
  console.log( "ngracefully shutting down from  SIGINT (Crtl-C)" )
  // wish this worked on Windows
  process.exit( )
})

в Windows этот код выполняется, но является слишком поздно что-либо делать грациозно:

process.on( 'exit', function() {
  console.log( "never see this log message" )
})

есть SIGINT эквивалентное событие в Windows?

6 62

6 ответов:

вы должны использовать модуль readline и прослушивать событие 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();
});

Я не уверен, когда, но на узле 8.x и на Windows 10 исходный код вопроса просто работает сейчас.

enter image description here

также работает с командной строкой windows.

Если вам не нужен импорт "readline" для других задач, я бы предложил импортировать "readline" после того, как программа проверит, что она работает на Windows. Кроме того, для тех, кто может не знать - это работает как на Windows 32-разрядных и Windows 64-разрядных систем (который будет возвращать ключевое слово "win32"). Спасибо за это решение Габриэль.

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

В настоящее время в узле все еще нет поддержки для захвата событий управления консолью windows, поэтому нет эквивалентов сигналам POSIX:

https://github.com/joyent/node/issues/1553

на документация по модулю tty дает пример механизма для захвата нажатий клавиш, чтобы инициировать изящное завершение работы, но тогда это работает только для 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();
  }
});

в настоящее время работаетна всех платформах, включая Windows.

следующие журналы кода, а затем завершается должным образом на Windows 10:

process.on('SIGINT', () => {
    console.log("Terminating...");
    process.exit(0);
});

начиная с узла.js 0.8 the keypress событие больше не существует. Однако существует пакет npm под названием нажатие это переопределяет событие.

установить с npm install keypress, затем сделайте что-то вроде:

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