2014-02-21 3 views
3

У меня есть задача, которая запускает асинхронный запуск IIS Express, и чтобы остановить IIS, я должен запустить событие grunt.Grunt task to wait for exit

Я хотел бы сделать задачу, которая просто ждет, пока я не нажму 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 
} 

Кроме того, я предлагаю, чтобы слушать сигналы 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.

+0

кажется правильным, однако я не могу подтвердить это сейчас, так как я не смотрел на это довольно долго. Если/когда я вернусь к этому репо, я посмотрю ... cheers – 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. –