2012-04-05 97 views
53

我按照指導here(偵聽SIGINT事件)正常關閉我的Windows-8託管的node.js應用程序以響應Ctrl-C或服務器關閉。但是Windows沒有SIGINT。我也嘗試過process.on('exit'),但這似乎遲遲沒有成果。什麼是node.js中process.on('SIGINT')的Windows等價物?

在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") 
}) 

Windows上是否存在SIGINT等效事件?

回答

92

你必須使用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(); 
}); 
+0

最優秀的更新,謝謝!將此設置爲答案,因爲之前的答案(聽按鍵)不再有效。 – pappadog 2013-02-16 00:50:34

+6

Upvote一百萬次。 – yourdeveloperfriend 2013-04-08 20:39:45

+0

你先生,搖滾。 https://github.com/bevacqua/node-sigint – bevacqua 2013-05-16 17:25:24

4

目前仍然有在節點用於捕獲窗口控制檯控制事件沒有支撐,所以有不等同於POSIX信號:

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

然而tty module documentation確實給的機構的一個示例性實施捕獲按鍵以啓動正常關機,但是這隻對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(); 
    } 
}); 
+0

感謝,一直在找這個信息,這對我來說是可以接受的替代,只要我能實現它的服務器爲CTRL上+ C。 +1(但是..任何想法,這是否會影響性能通過添加事件監聽器的過程?) – 2012-07-28 22:19:46

+0

我試過這樣做,但是當我的服務器運行遊戲循環stdin似乎不可用,CTRL + C doesn'當我使用上面的時候工作。 – 2012-07-28 23:37:06

0

由於node.js 0.8 keypress事件不再存在。然而,有一個名爲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"); 
     } 
    }); 
} 
7

除非你需要的「readline」導入其他任務,一旦程序驗證它在Windows上運行,我會建議導入「readline」。另外,對於那些可能不知道的人來說 - 這適用於Windows 32位和Windows 64位系統(這將返回關鍵字「win32」)。感謝這個解決方案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

我不知道什麼時候,但是在節點8.x和Windows 10上,原始問題代碼現在只能工作。

enter image description here

還與Windows命令提示符。

+0

我也注意到了這一點。 Windows 7對我來說是一個主要問題 – 2017-08-29 19:51:50

0

時下它只是工作on all platforms,包括Windows。

下面的代碼登錄,然後適當地結束在Windows 10:

process.on('SIGINT',() => { 
    console.log("Terminating..."); 
    process.exit(0); 
}); 
相關問題