我有一个启动IIS Express异步的任务,并且要停止IIS我必须触发一个grunt事件。
我想做一个等待直到我按ctrl-c
然后触发该事件的任务。
我试过这样做:
grunt.registerTask("killiis", function(){
process.stdin.resume();
var done = this.async();
grunt.log.writeln('Waiting...');
process.on('SIGINT', function() {
grunt.event.emit('iis.kill');
grunt.log.writeln('Got SIGINT. Press Control-D to exit.');
done();
});
});
该任务成功停止了grunt,但没有正确发送事件。
答案 0 :(得分:3)
SIGINT
处理程序在Node.js中工作,但不在Grunt中工作(我不知道为什么)。我使用ctrl+c
模块手动处理readline
并收听exit
事件:
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('SIGINT', function() {
process.emit('SIGINT');
});
process.on('exit', killIis);
function killIis() {
// kill it
}
此外,我建议收听SIGINT
,SIGHUP
和SIGBREAK
信号以处理控制台窗口关闭或ctrl+break
(如果有人使用它,嘿)。当您还要停止应用时,请在这些处理程序中调用process.exit()
:
process.on('exit', killIis);
process.on('SIGINT', killIisAndExit);
process.on('SIGHUP', killIisAndExit);
process.on('SIGBREAK', killIisAndExit);
我有一个grunt-iisexpress
的分支在退出时杀死了IIS:https://github.com/whyleee/grunt-iisexpress。
答案 1 :(得分:0)
我尝试了whyleee的建议,但我发现grunt
在关闭之前没有等待清理过程退出。
我的解决方案基于this article 。
module.exports = function(grunt) {
var exec, readline, shuttingDown, stdInterface;
shuttingDown = false;
readline = require("readline");
exec = require("child_process").exec;
// other grunt requires / task loads, including a "cleanup" task ...
stdInterface = readline.createInterface({
input: process.stdin,
output: process.stdout
});
stdInterface.on("SIGINT", function() {
var child;
if (shuttingDown) {
return;
}
shuttingDown = true;
console.info("Cleaning up ...");
child = exec("grunt cleanup", function(err, stdout, stderr) {
console.info(stdout);
process.exit(err ? 1 : 0);
});
});
// other grunt config ...
};