Я следую приведенным здесь инструкциям (прослушивание SIGINT
событий), чтобы корректно завершить работу моего приложения node.js, размещенного в Windows 8, в ответ на 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?
Ответы:
Вы должны использовать модуль 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 исходный код вопроса теперь просто работает.
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 );
также работает с командной строкой Windows.
источник
Если вам не нужен импорт «строки чтения» для других задач, я бы предложил импортировать «строку чтения» после того, как программа проверит, что она работает в 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(); });
источник
В настоящее время он работает на всех платформах , включая Windows.
Следующий код записывает, а затем корректно завершает работу в Windows 10:
process.on('SIGINT', () => { console.log("Terminating..."); process.exit(0); });
источник
В настоящее время в узле по-прежнему нет поддержки для захвата событий управления консоли 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(); } });
источник
Начиная с node.js 0.8
keypress
событие больше не существует. Однако существует пакет npm, называемый keypress, который повторно реализует событие.Установите с помощью
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"); } }); }
источник