Próbuję uruchomić aplikację węzła jako zadanie Grunt. Muszę jednak odrodzić to jako proces potomny, aby umożliwić równoległe uruchamianie zadania oglądania.Uruchamianie aplikacji węzła poprzez Grunt
to działa:
grunt.registerTask('start', function() {
grunt.util.spawn(
{ cmd: 'node'
, args: ['app.js']
})
grunt.task.run('watch:app')
})
Jednak, gdy zmiany są wykrywane przez zadanie zegarka, to będzie ponownie wywołać zadanie start. Zanim odrodzę kolejny proces potomny mojej aplikacji węzła, muszę zabić poprzednią.
Nie mogę jednak dowiedzieć się, jak zabić proces. Coś jak to nie działa:
var child
grunt.registerTask('start', function() {
if (child) child.kill()
child = grunt.util.spawn(
{ cmd: 'node'
, args: ['app.js']
})
grunt.task.run('watch:app')
})
Wydaje się, że:
- Nawet przechowywać zrodził proces w zmiennej poza kontekstem funkcji, nie ustępują, więc następnym razem uruchom zadanie, dziecko to
undefined
. child
nie makill
funkcja ...
Właśnie zamieniłem mój moduł 'grunt-contrib-watch' na gałąź [nospawn] (https://github.com/gruntjs/grunt-contrib-watch/tree/nospawn) i ustaw' nospawn' opcja true: https://gist.github.com/OliverJAsh/5021187. 'child' nadal nie jest zdefiniowane w drugim wywołaniu funkcji. Czy wiesz, w jaki sposób mogę zabić proces potomny? –
Gruntfile nie jest plikiem json, tylko plikiem js. Nie musisz też wywoływać zadania obserwacyjnego za pomocą metody grunt.task.run(). Oto przykład korzystania z zegarka w celu udostępnienia kontekstu: https://github.com/gruntjs/grunt-contrib-watch/blob/forenn/test/fixtures/forenn/Gruntfile.js#L35 –
Aby zabić proces potomny: 'child.kill ('SIGINT');' –