2012-10-13 17 views
16

Intencja: wywołanie aplikacji zewnętrznej z określonymi argumentami i wyjście ze skryptu.Jak odłączyć proces potomny w skrypcie Node.js?

Poniższy skrypt nie działa tak jak powinien:

#!/usr/bin/node 
var cp = require('child_process'); 
var MANFILE='ALengthyNodeManual.pdf'; 
cp.spawn('gnome-open', ['\''+MANFILE+'\''], {detached: true}); 

Rzeczy próbowałem: exec - nie odrywają. Wiele z góry dzięki

Odpowiedz

25

z dokumentacji node.js:

Domyślnie, rodzic będzie czekać na dom dziecka, aby wyjść. Aby uniemożliwić rodzicowi oczekiwanie na dane dziecko, należy użyć metody child.unref(), a pętla zdarzeń rodzica nie uwzględnia dziecka w jego liczniku referencji.

Podczas korzystania z opcji odłączenia w celu rozpoczęcia długotrwałego procesu proces nie będzie działał w tle, o ile nie zostanie dostarczony z konfiguracją stdio, która nie jest połączona z rodzica. Jeśli stdio rodzica jest dziedziczone, dziecko pozostanie podłączone do terminalu kontrolnego.

trzeba zmodyfikować kod tak:

#!/usr/bin/node 
var fs = require('fs'); 
var out = fs.openSync('./out.log', 'a'); 
var err = fs.openSync('./out.log', 'a'); 

var cp = require('child_process'); 
var MANFILE='ALengthyNodeManual.pdf'; 
var child = cp.spawn('gnome-open', [MANFILE], { detached: true, stdio: [ 'ignore', out, err ] }); 
child.unref(); 
+1

Wielkie dzięki! To działa. –

+2

Możesz ustawić "ignore" dla stdin, stdout, stderr: 'stdio: ['ignore'/* stdin * /, 'ignore'/* stdout * /, 'ignore'/* stderr * /]' –

3

moje rozwiązanie tego problemu:

app.js

require('./spawn.js')('node worker.js'); 

spawn.js

module.exports = function(command) { 
    require('child_process').fork('./spawner.js', [command]); 
}; 

spawner.js

require('child_process').exec(
    'start cmd.exe @cmd /k "' + process.argv[2] + '"', 
    function(){} 
); 
process.abort(0); 
+0

I Dodaję to tutaj, mimo że wybrałeś odpowiedź, ponieważ moje wyszukiwanie google opuściło mnie bez oczywistych alternatywnych rozwiązań. – CarbonDonuts

+0

Jest to, jak widać, zależne od systemu operacyjnego. Niezbyt pomocny dla osób korzystających z OS X i Unix/Linux. Przyjęta odpowiedź korzysta z własnych bibliotek standardowych node.js. –

+2

Chodziło o: _ utworzenie odłączonego terminalu poleceń i przekazanie polecenia_którnie rozpocząć proces. "child_process" niestety nie spełnia minimalnej potrzeby odrodzenia niezależnych procesów od mistrza w tym zakresie. Po prostu zamień na smak Linuksa: xterm, xdg-open. Chyba że możesz mi pokazać, jak to zrobić za pomocą twojego kodu ... który działa w obu systemach Windows i Linuksie. ; P Tak jak powiedziałem, próbuję rozwiązać problem, który jest bliski, ale nie całkiem zbliżony do tego, gdzie chcesz być. Google rzucił mnie tutaj, jako ostatnia nadzieja, zanim się poddałem i zorientowałem się coś dla siebie. Przepraszam za problem. – CarbonDonuts

Powiązane problemy