Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to fork a child process that listens on a different debug port than the parent

Tags:

node.js

I am trying to use child_process.fork to spawn a process that breaks and listens on the V8 debug protocol.

However, I can't get the forked process to listen on a port that's different from the parent process. Assuming the parent process listens on 6000, the child process also attempts to listen on port 6000:

Failed to open socket on port 6000, waiting 1000 ms before retrying

Here's my code:

// `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)

As you can see, I'm trying to get the forked process to listen on port 6001, but the child process attempts to listen on port 6000 which is in use by the parent.

How can I get the child process to listen on port 6001, or some other free port?

There are several threads on this subject. For example:

  • How to debug Node.JS child forked process?
  • Debugging Node.js processes with cluster.fork()

However:

  • These threads deal with the cluster variant of forking
  • Refer to execArgv, which appear to have been undocumented for process and are still undocumented for cluster.
like image 775
Dmitry Minkovsky Avatar asked Oct 08 '13 15:10

Dmitry Minkovsky


1 Answers

Simple enough answer, found on this comment and with some help from #Node.js on Freenode:

Just move the --debug-brk into the execArgv key of the options param to fork:

// 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 is the array of parameters passed to the node process. argv is the set passed to the main module. There's a dedicated parameter to child_process.fork for argv, but execArgvs have to be placed within the opts param. This works, and in the child process we have:

> 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"] 

In summary

Node.js consistently treats execArgv and argv as separate sets of values.

like image 185
Dmitry Minkovsky Avatar answered Sep 25 '22 03:09

Dmitry Minkovsky