群集工作程序未在调试模式下侦听

时间:2014-06-03 13:16:00

标签: node.js

当我在调试模式下运行此脚本时,会创建工作程序,但它们都没有正在侦听,主机的listening事件永远不会被触发,我也无法发出任何HTTP请求。

当我在没有调试模式的情况下运行时,一切正常,所以问题不在于脚本。

var cluster = require('cluster'),
    http = require('http');


if(cluster.isMaster){
    cluster.fork();
    cluster.fork();

    cluster.on('listening', function(){
        console.log('New process is listening');
    });
}
else{
    var server = http.createServer(function(req, res){
        res.end('hello');
    });

    server.listen(8080);
}

我的命令行参数很简单:

  • node --debug-brk = 59062 testCluster.js( debug
  • 节点testCluster.js( 正常

如果有人能够对此有所了解,我会很感激,并且可能自己运行脚本。

1 个答案:

答案 0 :(得分:1)

问题是由于所有进程(worker& master)都试图在同一端口上侦听调试操作引起的。我认为这导致工作者挂起,进程已启动,但实际上没有代码运行。

为了解决这个问题,我增加了每个新分叉工作人员的端口号......

var debugPort = getDebugPort(),
    inDebugMode = !!debugPort;

var workerArgv = process.execArgv.concat();

if(inDebugMode){
    cluster.setupMaster({
        execArgv: workerArgv
    });
}

function fork(){
    updateArgs(workerArgv, 'debug-brk', ++ debugPort);
    cluster.fork();
};

使用...

function getDebugPort(){
    var args = process.execArgv;

    for(var i = 0; i < args.length; i ++){
        var arg = args[i];

        if(arg.indexOf('--debug-brk=') == 0){
            var port = parseInt(arg.replace('--debug-brk=', ''));

            return isNaN(port) ? null : port;
        }
    }
};

function updateArgs(args, name, value){
    var search = '--' + name + '=';

    for(var i = 0; i < args.length; i ++){
        if(args[i].indexOf(search) == 0){
            args[i] = search + value;
            return;
        }
    }
};

我很惊讶这甚至可以在Webstorm调试器中运行,其中每个新的工作进程在其自己的选项卡中打开,但仍然将其日志记录路由到主服务器选项卡。