2012-04-05 6 views
53

Postępuję zgodnie ze wskazówkami here (nasłuchiwanie zdarzeń SIGINT), aby z wdzięcznością zamknąć moją aplikację node.js obsługiwaną przez system Windows-8 w odpowiedzi na zamknięcie Ctrl-C lub serwera.Jaki jest odpowiednik pliku process.on ('SIGINT') systemu Windows w pliku node.js?

Ale system Windows nie ma SIGINT. Próbowałem też process.on('exit'), ale wydaje się, że za późno, aby zrobić coś produktywnego.

W Windows, kod ten 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 zbyt późno, by zrobić cokolwiek wdzięku:

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

Czy istnieje zdarzenie równoważne SIGINT w systemie Windows?

Odpowiedz

92

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

najdoskonalsza aktualizacja, dzięki! ustawienie tej odpowiedzi jako poprzedniej odpowiedzi (nasłuchiwanie naciśnięcia klawisza) już nie działa. – pappadog

+6

Awansuj milion razy. – yourdeveloperfriend

+0

ty sir, Rock. https://github.com/bevacqua/node-sigint – bevacqua

4

Obecnie nadal nie ma wsparcia w węźle do przechwytywania zdarzeń Konsola okna, więc nie ma żadnych odpowiedników na sygnały POSIX:

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

Jednak tty module documentation daje przykład mechanizm przechwytywanie naciśnięć klawiszy w celu zainicjowania zgrabnego wyłączenia, ale wtedy działa to tylko dla ctrl + c.

+0

Dzięki, szukałem tej informacji, to jest dopuszczalne zastąpienie dla mnie tak długo, jak mogę wdrożyć go na serwerze dla dla CTRL + C. +1 (Ale .. Jakiś pomysł, czy to wpłynie na wydajność poprzez dodanie detektorów zdarzeń w procesie?) –

+0

Próbowałem to zrobić, ale kiedy mój serwer działa pętla gra stdin nie wydaje się być dostępna, CTRL + C doesn ' t działa, gdy korzystam z powyższych. –

0

Ponieważ node.js 0.8 zdarzenie keypress już nie istnieje. Istnieje jednak pakiet npm o nazwie keypress, który reimplementuje wydarzenie.

Instalacja z npm install keypress, a następnie zrobić 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"); 
     } 
    }); 
} 
7

Chyba że potrzebne "readline" import do innych zadań, sugerowałbym importowanie "readline", gdy program sprawdzi, czy działa w systemie Windows. Dodatkowo dla tych, którzy mogą nie być świadomi - działa to zarówno w 32-bitowych systemach Windows, jak i 64-bitowych systemach Windows (które zwrócą 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(); 
}); 
6

Nie jestem pewien od kiedy, ale na węźle 8.x i na Windows 10 oryginalny kod zapytania po prostu działa teraz.

enter image description here

współpracuje również z okna wiersza polecenia.

+0

Zauważyłem to również. Windows 7 to dla mnie poważny problem –

0

Obecnie po prostu działaon all platforms, w tym Windows.

następujące dzienniki kod, a następnie kończy się prawidłowo w systemie Windows 10:

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