Postępuję zgodnie ze wskazówkami tutaj (nasłuchiwanie SIGINT
zdarzeń), aby bezpiecznie zamknąć moją aplikację node.js hostowaną w systemie Windows-8 w odpowiedzi na Ctrl+ Club zamknięcie serwera.
Ale Windows nie ma SIGINT
. Ja też próbowałem process.on('exit')
, ale wydaje mi się , że jest to za późno, aby zrobić cokolwiek produktywnego.
W systemie Windows ten kod daje mi: Błąd: nie ma takiego modułu
process.on( 'SIGINT', function() {
console.log( "\ngracefully shutting down from SIGINT (Crtl-C)" )
// wish this worked on Windows
process.exit( )
})
W systemie Windows ten kod działa, ale jest za późno, aby zrobić cokolwiek wdzięcznego :
process.on( 'exit', function() {
console.log( "never see this log message" )
})
Czy istnieje SIGINT
równoważne zdarzenie w systemie Windows?
Odpowiedzi:
Musisz użyć modułu readline i nasłuchiwać zdarzenia 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(); });
źródło
Nie jestem pewien, kiedy, ale w węźle 8.x i Windows 10 oryginalny kod zapytania po prostu teraz działa.
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 );
działa również z wierszem poleceń systemu Windows.
źródło
O ile nie potrzebujesz importu „readline” do innych zadań, sugerowałbym zaimportowanie „readline” po sprawdzeniu, że program działa w systemie Windows. Dodatkowo dla tych, którzy mogą być nieświadomi - działa to zarówno na 32-bitowych, jak i 64-bitowych systemach Windows (co zwróci słowo kluczowe „win32”). Dzięki za to rozwiązanie 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(); });
źródło
Obecnie działa tylko na wszystkich platformach , w tym Windows.
Poniższy kod rejestruje się, a następnie kończy poprawnie w systemie Windows 10:
process.on('SIGINT', () => { console.log("Terminating..."); process.exit(0); });
źródło
Obecnie w węźle nadal nie ma obsługi przechwytywania zdarzeń sterujących konsoli systemu Windows, więc nie ma odpowiedników dla sygnałów POSIX:
https://github.com/joyent/node/issues/1553
Jednak dokumentacja modułu tty podaje przykład mechanizmu przechwytywania naciśnięć klawiszy w celu zainicjowania wdzięcznego zamknięcia, ale wtedy działa to tylko dla 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(); } });
źródło
Od node.js 0.8
keypress
zdarzenie już nie istnieje. Istnieje jednak pakiet npm o nazwie keypress, który ponownie implementuje zdarzenie.Zainstaluj za pomocą
npm install keypress
, a następnie zrób coś takiego:// 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"); } }); }
źródło