8

我正在尝试使用child_process.fork生成一个中断并侦听 V8 调试协议的进程。

但是,我无法让分叉进程监听与父进程不同的端口。假设父进程监听6000,子进程也尝试监听端口6000

在端口 6000 上打开套接字失败,等待 1000 毫秒后重试

这是我的代码:

// `test.js`, invoked as `node --debug-brk=6000 test.js`

var nodeModule, args, env, child

nodeModule = path.normalize(path.join(__dirname, '..', 'app.js'))

args = [
    '--debug-brk=6001'
  , '127.0.0.1'
  , 3030
  , 'api-testing'
]

env = { 'DB_URI': 'mongodb://localhost/test' }

child = require('child_process')
  .fork(nodeModule, args, {env: env})
  .on('message', callback)

正如你所看到的,我试图让分叉进程监听端口6001,但子进程试图监听6000父进程正在使用的端口。

如何让子进程监听 port6001或其他一些空闲端口?

关于这个主题有几个线程。例如:

然而:

  • 这些线程处理cluster分叉的变体
  • 请参阅execArgv,这似乎是无证的process并且仍然是无证的cluster
4

2 回答 2

10

足够简单的答案,在此评论中找到,并在 Freenode 上的#Node.js 提供了一些帮助:

只需将参数--debug-brkexecArgv键移至:optionsfork

// Excerpt:

args = [
   '127.0.0.1'
  , 3030
  , 'api-testing'
]

env = { 'DB_URI': 'mongodb://localhost/test' }

child = fork(nodeModule, args, {
    env: env
  , execArgv: ['--debug-brk=6001']
})
  .on('message', this.callback)

execArgv是传递给节点进程的参数数组。argv是传递给主模块的集合。child_process.forkfor有一个专用参数argv,但execArgvs 必须放在opts参数中。这有效,在子进程中我们有:

> process.execArgv 
["--debug-brk=6001"]
> process.argv
["/usr/local/Cellar/node/0.10.13/bin/node" "/Users/dmitry/dev/linksmotif/app.js", "127.0.0.1", "3030", "api-testing"] 

总之

Node.js 始终将execArgvargv视为单独的值集。

于 2013-10-08T16:01:27.013 回答
0

在 fork 删除旧debug-brk参数之前:

process.execArgv = process.execArgv.filter(function(o){ 
    var x = "--debug-brk"; 
    return o.substring(0, x.length) !== x
});

并添加一个新的:

process.execArgv.push("--debug-brk=9999");
于 2015-08-31T16:45:49.580 回答