2016-03-03 45 views
8

Według the docs dla child_process.spawn chciałbym oczekiwać, aby móc uruchomić proces potomny na pierwszym planie i pozwalają sam proces węzła, aby wyjść tak:node.js: Jak na tarło wolnostojący dziecko na pierwszym planie i wyjściem

handoff-exec.js:

'use strict'; 

var spawn = require('child_process').spawn; 

// this console.log before the spawn seems to cause 
// the child to exit immediately, but putting it 
// afterwards seems to not affect it. 
//console.log('hello'); 

var child = spawn(
    'ping' 
, [ '-c', '3', 'google.com' ] 
, { detached: true, stdio: 'inherit' } 
); 

child.unref(); 

Zamiast widzieć wyjście komendy na ping, to po prostu wychodzi bez żadnego komunikatu lub błędu.

node handoff-exec.js 
hello 
echo $? 
0 

A więc ... czy w pliku node.js (lub w ogóle) możliwe jest uruchamianie elementu potomnego na pierwszym planie w momencie wyjścia elementu nadrzędnego?

UPDATE: Uważam, że usunięcie console.log('hello'); pozwala dziecku do uruchomienia, jednak nadal nie przechodzi pierwszoplanowy kontrolę stdin do dziecka.

+0

Możliwy duplikat [Jak słuchać i odradzać wiele procesów potomnych w nodejs] (http://stackoverflow.com/questions/32358845/how-do-i-listen-and-spawn-multiple-child-process- in-nodejs) –

+0

Nie. Chodziło o użycie zamknięcia w JavaScript do przechwytywania odwołań JS do wielu procesów podrzędnych. Chodzi o referencje procesowe i umożliwienie dziecku przejęcia kontroli nad standardowym wejściem. – CoolAJ86

+0

Po to, co jest warte, próbowałem uruchomić twój kod i działało zgodnie z oczekiwaniami - proces węzłowy został zakończony, a wyniki polecenia ping zostały wypisane na standardowe wyjście. Dotyczy to systemów Mac OS i node.js w wersji 5.4.1. To nie działa, jeśli odkomentuję plik console.log, który uważam za bardzo dziwny. –

Odpowiedz

-1

Brakuje

// Listen for any response: 
child.stdout.on('data', function (data) { 
    console.log(data.toString()); 
}); 

// Listen for any errors: 
child.stderr.on('data', function (data) { 
    console.log(data.toString()); 
}); 

i nie trzeba się child.unref();

+1

To spowoduje, że proces nadrzędny będzie kontynuowany. – CoolAJ86