2015-12-04 13 views
6

Wenn wir einen child_process in Node forkieren, wie können wir Knotenparameter an den child_process übergeben?Übergabe von Knotenflags/args an Kindprozess

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

Insbesondere würde ich gerne ~ 20 Prozesse, um laichen, und möchte die Speichernutzung jedes begrenzen, indem Sie --v8-Optionen, aber ich kann keine Beispiele, dies zu tun finden - ist Ist dies möglich, oder nehmen die untergeordneten Prozesse die gleichen Knotenparameter an wie die übergeordneten?

würde die Eltern sein: würde

node --some-flag=bar baz.js 

...

Ich bin auf der Suche nach Knoten Optionen übergeben mit

child_process.fork() 

node foo.js 

und die Kinder sein aber wenn es an ist ly möglich mit

spawn() 

oder

exec() 

dann denke ich, dass ich das, was ich bekommen kann.

Als einfaches Beispiel das Folgende nicht laufen Node.js mit der --harmony Flagge

var cp = require('child_process'); 

    var args = ['--harmony']; 

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

es sieht aus wie Gabel Dokumentation sagt es akzeptiert eine Liste von Args zu https: // nodejs.org/api/child_process.html # child_process_child_process_fork_modulepath_args_options – dm03514

+0

Ich denke, diese Argumente gehen nur zu Ihrem Programm, nicht zu node.js selbst, mit anderen Worten, diese Argumente sind nicht zu V8, nur zu Ihrem Programm –

+0

Ich habe versucht, ein Beispiel zu bieten warum das funktioniert nicht in der OP –

Antwort

10

Sie werden die execArgv Option fork einstellen müssen.

Wenn Sie dies nicht tun, erhalten Sie die gleiche Option wie der Knotenprozess, den Sie "forking" (es ist eigentlich nur ein spawn, kein POSIX-Fork).

So könnte man so etwas tun:

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

Wenn Sie auf den Knoten-Optionen von der übergeordneten übergeben möchten:

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

Warnung:child_process eine Sicherung gegen das hat -e wechseln, dass Sie damit umgehen! Also tun Sie dies nicht von der Kommandozeile aus mit -e oder -p. Sie erstellen einen neuen Prozess mit einem Skript, das mit dem des übergeordneten Objekts identisch ist - einer Gabelzerstörung.

Wenn Sie noch über die Umwelt gabeln auf Optionen zu übergeben können, wollen, können Sie etwas tun:

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

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

Eine weitere Option kann process.execArgv (wie process.execArgv.push('--harmony')) zu ändern, aber ich bin ziemlich Sicher, das ist eine schlechte Idee und könnte zu seltsamen Verhalten in anderen Ländern führen.

+0

Danke für die Antwort und das Verstehen meiner Frage. Ich werde es ausprobieren. Ich sehe keinen Grund, warum es mit cp.fork() weniger möglich sein sollte als mit exec oder spawn, es sei denn, man kann sich einen guten Grund dafür vorstellen. –

+0

@AlexMills: [Der Code für 'fork' ist ziemlich lesbar] (https://github.com/nodejs/node/blob/master/lib/child_process.js#L19) (abgesehen von dem Argument Magie in der ersten Linien), ist es im Wesentlichen eine Bequemlichkeitsfunktion für das Spawn. Ohne all die Magie ist es etwa so: 'cp.spawn (process.execpath, (options.execArgs || process.execars) .concat ([modulame], args), options)' das Problem ist, dass args nach dem kommt Modulname, vorher nicht. Sie haben darüber nachgedacht und Sie können Argumenten als Option zum Knoten liefern (wie in den Dokumenten angegeben). –

+0

versucht zu bestätigen, dass dies funktioniert, aber nicht finden können, wie v8-Flags von einem Knotenprozess verwendet werden. –

Verwandte Themen