Ich folge hier den Anweisungen (auf SIGINT
Ereignisse warten), um meine von Windows-8 gehostete Anwendung node.js als Reaktion auf das Herunterfahren von Ctrl+ Coder Server ordnungsgemäß herunterzufahren.
Aber Windows hat nicht SIGINT
. Ich habe es auch versucht process.on('exit')
, aber das scheint zu spät, um etwas Produktives zu tun.
Unter Windows gibt mir dieser Code: Fehler: Kein solches Modul
process.on( 'SIGINT', function() {
console.log( "\ngracefully shutting down from SIGINT (Crtl-C)" )
// wish this worked on Windows
process.exit( )
})
Unter Windows wird dieser Code ausgeführt, ist jedoch zu spät, um etwas Anmutiges zu tun :
process.on( 'exit', function() {
console.log( "never see this log message" )
})
Gibt es ein SIGINT
gleichwertiges Ereignis unter Windows?
Antworten:
Sie müssen das Readline-Modul verwenden und auf ein SIGINT-Ereignis warten:
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(); });
quelle
Ich bin mir nicht sicher, wann, aber auf Knoten 8.x und Windows 10 funktioniert der ursprüngliche Fragencode jetzt einfach.
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 );
funktioniert auch mit einer Windows-Eingabeaufforderung.
quelle
Sofern Sie den Import "readline" nicht für andere Aufgaben benötigen, würde ich empfehlen, "readline" zu importieren, sobald das Programm überprüft hat, dass es unter Windows ausgeführt wird. Darüber hinaus funktioniert dies sowohl für Windows 32-Bit- als auch für Windows 64-Bit-Systeme (die das Schlüsselwort "win32" zurückgeben). Danke für diese Lösung 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(); });
quelle
Heutzutage funktioniert es nur auf allen Plattformen , einschließlich Windows.
Der folgende Code protokolliert und wird unter Windows 10 ordnungsgemäß beendet:
process.on('SIGINT', () => { console.log("Terminating..."); process.exit(0); });
quelle
Derzeit gibt es im Knoten noch keine Unterstützung für die Erfassung der Windows-Konsolensteuerungsereignisse. Daher gibt es keine Entsprechungen zu den POSIX-Signalen:
https://github.com/joyent/node/issues/1553
Die Dokumentation zum tty-Modul enthält jedoch ein Beispiel für einen Mechanismus zum Erfassen der Tastendrücke, um ein ordnungsgemäßes Herunterfahren einzuleiten. Dies funktioniert jedoch nur für 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(); } });
quelle
Seit node.js 0.8 existiert das
keypress
Ereignis nicht mehr. Es gibt jedoch ein npm-Paket namens keypress , das das Ereignis erneut implementiert.Installieren Sie mit
npm install keypress
und machen Sie dann etwas wie:// 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"); } }); }
quelle