当我在调试模式下运行此脚本时,会创建工作程序,但它们都没有正在侦听,主机的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);
}
我的命令行参数很简单:
如果有人能够对此有所了解,我会很感激,并且可能自己运行脚本。
答案 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调试器中运行,其中每个新的工作进程在其自己的选项卡中打开,但仍然将其日志记录路由到主服务器选项卡。