【问题标题】:Passing node flags/args to child process将节点标志/参数传递给子进程
【发布时间】:2015-12-04 19:59:09
【问题描述】:

如果我们在 Node 中 fork 一个 child_process,我们如何将节点参数传递给 child_process?

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

具体来说,我想生成大约 20 个进程,并想通过使用 --v8-options 来限制每个进程的内存使用,但我找不到任何这样做的例子 - 这可能吗?进程假定与父节点相同的节点参数?

父母是:

node foo.js

孩子们会

node --some-flag=bar baz.js

...

我希望使用

传递节点选项
child_process.fork()

但如果只有

有可能
spawn()

exec()

那我想我会拿走我能得到的。

作为一个简单的例子,以下将运行带有--harmony标志的Node.js

   var cp = require('child_process');

   var args  = ['--harmony'];

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

【问题讨论】:

  • 看起来 fork 文档说它也接受 args 列表 nodejs.org/api/…
  • 我认为这些参数只是传递给你的程序,而不是 node.js 本身,换句话说,这些参数不是 V8,只是你的程序
  • 我试图提供一个例子说明为什么这在 OP 中不起作用

标签: node.js fork child-process


【解决方案1】:

您需要将execArgv 选项设置为fork

如果您不这样做,您将获得与您正在“分叉”的节点进程相同的选项(它实际上只是 spawn,而不是 POSIX 分叉)。

所以你可以这样做:

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

如果你想从父节点传递节点选项:

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

警告: child_process 可以防止您正在规避的 -e 开关!所以不要在命令行中使用-e-p 执行此操作。 您将使用与父进程相同的脚本创建一个新进程 - 一个 fork 炸弹。

如果您仍然希望能够通过环境将选项传递给 fork,您可以执行以下操作:

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

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

另一种选择可能是更改process.execArgv(如process.execArgv.push('--harmony')),但我很确定这是一个坏主意,可能会导致其他地方出现奇怪的行为。

【讨论】:

  • 感谢您的回答和理解我的问题。我会试试看。我认为没有理由使用 cp.fork() 比使用 exec 或 spawn 更不可能,除非你能想到一个很好的理由。
  • @AlexMills: the code for for fork is quite readable(除了第一行中的参数魔法),它本质上是一个方便生成的函数。没有所有的魔法,它是这样的:cp.spawn(process.execPath, (options.execArgs || process.execArgs).concat([moduleName], args), options) 问题是 args 出现在模块名称之后,而不是之前。他们已经想到了这一点,您可以将参数作为选项提供给节点(如文档中所述)。
  • 试图确认这是否有效,但找不到如何记录节点进程正在使用哪些 v8 标志..
  • 没关系,您可以通过查看子进程中的 process.execArgv 来确认 execArgs 是否已传递给子进程
猜你喜欢
  • 2017-10-18
  • 2020-09-30
  • 2018-05-05
  • 1970-01-01
  • 2018-01-15
  • 2017-08-13
  • 2018-09-17
  • 1970-01-01
  • 2021-02-09
相关资源
最近更新 更多