2013-04-24 5 views
16

Ich versuche derzeit, mehrere Schritte auszuführen, bei denen Aufgaben in untergeordneten Prozessen generiert werden müssen. Zum Beispiel:Getötete Prozesse beim Beenden beenden

  1. Uhr Dateien
  2. mein Static-Site-Generator Vorschau für Server

ich leicht ein Aufgaben verwenden können, wie grunt-concurrent starten bis zu beides gleichzeitig laufen zu haben. Wenn ich jedoch grunt verlasse, läuft der Kindprozess (in diesem Fall der statische Site-Generator, den ich benutze grunt-shell) weiter. Ich hätte gerne, dass diese Aufgaben gleichzeitig ausgeführt werden - aber sie müssen auch getötet werden, wenn sie rauskommen.

Gedanken?

Antwort

0

Gibt es einen Grund, warum Sie grunt-contrib-connect nicht zum Starten eines Servers in Ihrem Projektstamm verwenden?

wenn möglich tun dies stattdessen Grunzen-Shell zu verwenden, und der Server wird automatisch ausgeschaltet, wenn Ihr Grunzen Prozess verlässt

+0

Toller Punkt - aber leider nicht. Ich arbeite mit Wintersmith als Site-Generator (der einen Connect-Server verwendet) - aber ich möchte vermeiden, dass ich diese Logik für den Preview-Server duplizieren muss. – dtuckernet

1

nicht sicher, wie dies mit Grunzen-Shell arbeitet. Aber wenn Sie eine benutzerdefinierte Grunzen Aufgabe würde Setup des Servers ausführen könnten Sie versuchen, ungefähr wie:

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'); 
    }); 
+1

Ich habe das mit keinem Erfolg versucht (keine Nachricht geschrieben oder Server getötet), leider. – Pat

+0

Das ist die beste Antwort in meinem Geschmack. einfach, direkt auf den Punkt. keine Lernkurven. Ich unterstütze wirklich keine Bibliotheken, wenn etwas so einfach ist. Technisch gesehen sollte das grunt shell plugin das intern gemacht haben. ein einfaches Miss. –

0

Offenbar hat grunt-shell nicht process Exit-Ereignisse behandeln: https://github.com/sindresorhus/grunt-shell/blob/master/tasks/shell.js

Deshalb habe ich den Verdacht, dass Ihr Grunzen Prozess verlässt und grunt-shell warnt nie ist es Kind Prozess, der übergeordnete Prozess wird beendet.

Zum Beispiel grunt-concurrent tut es tötet Kind-Prozesse ist, wie wir hier sehen können:

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

Quelle: https://github.com/sindresorhus/grunt-concurrent/blob/master/tasks/concurrent.js#L55

So grunt-shell verwendet, wird nicht für Sie arbeiten.

Eine Lösung besteht darin, in Ihrer Gruntfile wintersmith anzufordern und es programmgesteuert in einer benutzerdefinierten Aufgabe auszuführen.