2015-12-04 64 views
6

Jeśli rozwidujemy proces child_process w węźle, w jaki sposób możemy przekazać parametry węzła do child_process?Przekazywanie flag/argów węzła do procesu potomnego

https://nodejs.org/api/child_process.html

Konkretnie chciałbym tarło ~ 20 procesów, a chcieliby, aby ograniczyć zużycie pamięci każdego za pomocą --v8-options, ale nie mogę znaleźć żadnych przykładów w ten sposób - to to możliwe lub czy procesy podrzędne przyjmują te same parametry węzła, co nadrzędne?

rodzic będzie:

node foo.js 

a dzieci byłyby

node --some-flag=bar baz.js 

...

szukam przekazać opcje węzła przy użyciu

child_process.fork() 

ale jeśli jest włączony ly możliwe

spawn() 

lub

exec() 

następnie Chyba wezmę co mogę dostać.

Jako prosty przykład, następujące nie run node.js z --harmony flagą

var cp = require('child_process'); 

    var args = ['--harmony']; 

    var n = cp.fork(filePath, args , Object.create(process.env)); 
+1

Wygląda na to, że dokumentacja widelca mówi, że akceptuje listę argumentów zbyt https: // nodejs.org/api/child_process.html # child_process_child_process_fork_modulepath_args_options – dm03514

+0

Myślę, że te argumenty po prostu trafiają do twojego programu, nie do samego node.js, innymi słowy, te argumenty nie są do V8, tylko do twojego programu –

+0

Próbowałem podać przykład dlaczego to nie działa w OP –

Odpowiedz

10

Musisz ustawić opcję execArgv do fork.

Jeśli tego nie zrobisz, otrzymasz tę samą opcję, co proces węzłowy, który "rozwidlasz" (w rzeczywistości jest to tylko spawn, a nie POSIX-fork).

Więc można zrobić coś takiego:

var n = cp.fork(modname, {execArgv: ['--harmony']}); 

Jeśli chcesz przekazać na węźle opcji z rodzicem:

var n = cp.fork(modname, {execArgv: process.execArgv.concat(['--harmony'])} 

Ostrzeżenie:child_process posiada zabezpieczenie przed -e przełącznik, który omijasz z tym! Więc nie rób tego z linii poleceń z -e lub -p. Będziesz tworzyć nowy proces ze skryptem, który jest taki sam, jak od rodzica - bomba widelec.

Jeśli nadal chcą być w stanie przejść od opcji do stołu przez środowisko, można zrobić coś takiego:

var cp = require('child_process'); 
var opts = Object.create(process.env); 
opts.execArgv = ['--harmony']; 

var n = cp.fork(filePath, opts); 

Inną opcją może być alter process.execArgv (jak process.execArgv.push('--harmony')), ale jestem całkiem z pewnością jest to zły pomysł i może prowadzić do dziwnych zachowań.

+0

dzięki za odpowiedź i zrozumienie mojego pytania. Wypróbuję to. Nie widzę powodu, dla którego byłoby mniej możliwości zrobienia tego za pomocą cp.fork() niż przy użyciu exec lub spawn, chyba że potrafisz wymyślić dobry powód. –

+0

@AlexMills: [kod dla 'fork' jest całkiem czytelny] (https://github.com/nodejs/node/blob/master/lib/child_process.js#L19) (oprócz argumentu magic w pierwszym linie), jest to zasadniczo funkcja wygody dla spawnu. Bez całej magii jest to coś takiego: 'cp.spawn (process.execPath, (options.execArgs || process.execArgs) .concat ([moduleName], args), opcje)' problem polega na tym, że argumenty przychodzą po nazwa modułu, a nie wcześniej. Pomyśleli o tym i możesz dostarczyć argumenty do węzła jako opcję (jak stwierdzono w dokumentach). –

+0

próbuję potwierdzić, że to działa, ale nie mogę znaleźć sposobu zapisywania, które flagi v8 są używane przez proces węzłowy. –