2014-02-21 77 views
3

我有一個啓動IIS Express異步的任務,並且要停止IIS,我必須開啓一個grunt事件。等待退出的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(); 
    }); 
}); 

任務成功停止的呼嚕聲,但無法正常發送事件。

回答

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 
} 

此外,我建議聽SIGINTSIGHUPSIGBREAK信號處理控制檯窗口關閉或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

+0

似乎是正確的,但我目前無法確認,因爲我在很長一段時間沒有看過這個。如果/當我回到這個回購,我會看看...乾杯 – MrJD

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

鏈接不工作了。 404錯誤。 –