如何派生一个在父进程侦听不同debugging端口的subprocess
我正在试图使用child_process.fork
产生一个进程,打破和监听V8debugging协议。
但是,我不能让分叉进程监听与父进程不同的端口。 假设父进程在6000
侦听,subprocess也会尝试侦听端口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
上侦听,但subprocess尝试侦听父进程正在使用的端口6000
。
我怎样才能让subprocess侦听端口6001
或其他一些自由端口?
这个主题有几个线程。 例如:
- 如何debuggingNode.JS子分叉进程?
- 使用cluster.fork()debuggingNode.js进程
然而:
- 这些线程处理分叉的
cluster
变体 - 请参阅
execArgv
,该文件似乎execArgv
logging在process
,并且仍然没有为cluster
。
足够简单的答案,发现这个评论 ,并从Freenode的#Node.js一些帮助:
只需将--debug-brk
移动到options
param的execArgv
键中即可:
// 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
是传递给主模块的集合。 对于argv
,有一个专用于child_process.fork
参数,但execArgv
必须放在opts
参数中。 这是有效的,在subprocess中我们有:
> 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始终将execArgv
和argv
作为单独的值集处理。
在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");