Убивание порожденных процессов при выходе Grunt

В настоящее время я пытаюсь выполнить несколько шагов, требующих создания задач для дочерних процессов. Например:

  • Смотреть файлы
  • Запустите сервер предварительного просмотра генератора статических сайтов.

Я могу легко использовать такие задачи, как grunt-concurrent, чтобы обе эти операции выполнялись одновременно. Однако, когда я заканчиваю хрюкать, дочерний процесс (в этом случае - статический генератор сайта, который я запускаю с помощью grunt-shell), продолжает работать. Я хотел бы, чтобы эти задачи выполнялись одновременно, - но также их можно убить, когда выходите из-под контроля.

Мысли?

Ответы

Ответ 1

Не знаю, как это работает с grunt-shell. Но если вы настроили пользовательскую задачу grunt для запуска своего сервера, вы можете попробовать что-то вроде:

  var spawn = require('child_process').spawn;
  var server = spawn('myserver', ['--foo']);
  process.on('exit', function() {
     grunt.log.writeln('killing myserver...');
     server.kill();
     grunt.log.writeln('killed myserver');
  });

Ответ 2

Есть ли какая-то причина, по которой вы не используете grunt-contrib-connect для запуска сервера в корне вашего проекта?

если это возможно, вместо использования grunt-shell, и сервер автоматически отключится, когда ваш процесс grunt завершит

Ответ 3

Возможно, поэтому grunt-exit был создан.

Ответ 4

По-видимому, grunt-shell не обрабатывает события выхода process: https://github.com/sindresorhus/grunt-shell/blob/master/tasks/shell.js

Поэтому я подозреваю, что ваш процесс grunt завершается, а grunt-shell никогда не предупреждает о его дочернем процессе, который останавливает родительский процесс.

Например, grunt-concurrent убивает его дочерние процессы, как мы можем видеть здесь:

process.on('exit', function () {
    cpCache.forEach(function (el) {
        el.kill();
    });
});

Источник: https://github.com/sindresorhus/grunt-concurrent/blob/master/tasks/concurrent.js#L55

Таким образом, использование grunt-shell не будет работать для вас.

Одним из решений является требование wintersmith в вашем файле Grunt и его программное программирование в пользовательской задаче.

Ответ 5

См. мой ответ на fooobar.com/info/328432/....

Это полезно, если у вас есть script, который явно необходимо вызвать (например: когда этот процесс будет демоннизирован).