Вопрос по node.js, windows – Что такое Windows-эквивалент process.on ('SIGINT') в файле node.js?

67

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

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

В Windows этот код дает мне:Error: No such module

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

В Windows этот код выполняется, ноtoo late to do anything graceful:

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

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

Эта проблема случайно возникла у меня сегодня, и я думаю, что это как-то связано с самим модулем readline. Я не смог провести никакого тестирования, но после добавления этого модуля у меня возникла проблема. Sv443

Ваш Ответ

6   ответов
123

Вы должны использовать модуль 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();
});
Поднять голос в миллион раз.
Это нелепо. Почему это не обрабатывается ядром узла?
Похоже, это было решено довольно давно:github.com/nodejs/node-v0.x-archive/issues/5054
Потому что, когда вы слушаете stdin, процесс никогда не завершится, пока вы не отправите сигнал SIGINT явно.
Поэтому вам необходимо отправить случайное сообщение от родителя к ребенку, например: «SIGINT».
13

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

enter image description here

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

Я тоже это заметил. Windows 7 является серьезной проблемой для меня здесь
Этот метод работает для меня с Node 8.11.1 в Windows 7 -but Я запускал его из оболочки git bash. Думаю, я сначала попробую простой способ, и он сработает.
4

Настоящее времяit just works на всех платформах, в том числе Windows.

Следующий код регистрирует и затем корректно завершает работу в Windows 10:

process.on('SIGINT', () => {
    console.log("Terminating...");
    process.exit(0);
});
Это не работает для меня под Cygwin. Использование последней версии Windows 10 (автоматическое обновление), версия узла 8.11.4. По "НЕ работает" Я имею в виду, что 1) процесс завершается, но 2) сообщение не регистрируется на консоли и 3) созданные соединения HTTP не закрываются. Я должен добавить, однако, что я попробовал его под PowerShell, и он работает там, как и ожидалось. Но я переключился на Cygwin, потому что PowerShell имеет плохую команду curl. Штопать!
Он перестал работать для меня только сегодня без видимой причины (вообще никаких обновлений), и я до сих пор не знаю, почему. Принятый ответ исправил это.
7

Если вам не нужна строка "readline" импорт для других задач, я бы предложил импортировать & quot; readline & quot; когда программа проверит, что она работает в Windows. Кроме того, для тех, кто может не знать об этом, - это работает как в 32-битных, так и в 64-битных системах Windows (которые будут возвращать ключевое слово "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();
});
0

Начиная с node.js 0.8,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");
        }
    });
}
4

В настоящее время в узле все еще нет поддержки для захвата событий управления консоли 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();
  }
});
Я пытался сделать это, но когда на моем сервере запущен игровой цикл, stdin, по-видимому, недоступен, CTRL + C не работает, когда я использую вышеуказанное.
Спасибо, искал эту информацию, это приемлемая замена для меня, пока я могу реализовать ее на сервере для CTRL + C. +1 (но .. Есть идеи, повлияет ли это на производительность, добавив прослушиватели событий в процесс?)

Похожие вопросы