Passing node flags/args to child process

2019-03-28 13:10发布

问题:

If we fork a child_process in Node, how can we pass node parameters to the child_process?

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

Specifically I would like to spawn ~20 processes, and would like to limit the memory usage of each by using --v8-options, but I can't find any examples of doing this - is this possible or do the child processes assume the same node parameters as the parent?

the parent would be:

node foo.js

and the children would be

node --some-flag=bar baz.js

...

I am looking to pass node options using

child_process.fork()

but if it's only possible with

spawn()

or

exec()

then I guess I will take what I can get.

As a simple example, the following will not run Node.js with the --harmony flag

   var cp = require('child_process');

   var args  = ['--harmony'];

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

回答1:

You'll need to set the execArgv option to fork.

If you don't, you'll get the same option as the node process you're 'forking' (it actually is just a spawn, not a POSIX-fork).

So you could do something like this:

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

If you want to pass on the node-options from the parent:

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

Warning: child_process has a safeguard against the -e switch that you are circumventing with that! So don't do this from the command line with an -e or -p. You will be creating a new process with a script that is the same as that from the parent – a fork bomb.

If you still want to be able to pass on options to fork via the environment, you could do something like this:

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

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

Another option may be to alter process.execArgv (like process.execArgv.push('--harmony')) but I am pretty sure that is a bad idea and might result in strange behaviour elswhere.