Nodejs 支持child_process调试端口设置

Nodejs 支持child_process调试端口设置

问题描述: 在使用child_process fork子进程时,如果master以debug模式启动时,nodeJS模式使用master的启动参数启动子进程(包含debug参数),导致子进程debug端口启动失败。 解决办法: 在fork子进程时,获取master的debug参数,然后通过参数设置child_process调试参数信息,代码参考:

function startWorker(handle){
    var debug = isDebug();
    for(var i=0; i<WORKER_NUMBER; i++){
        var c  = null;
        if (debug){
            c  =  cp.fork(WORKER_PATH,{execArgv: [ '--debug='+(process.debugPort+i+1) ]});
        }else{
            c  =  cp.fork(WORKER_PATH);
        }
        c.send({"server" : true}, handle);
        childs.push(c);
    }
    function isDebug(){
        for(var i=0;i<process.execArgv.length;i++){
            if(process.execArgv[i].indexOf("--debug")==0 ){
                return true;
            }
        }
        return false;
    }
} 

参考


2 回复

Nodejs 支持child_process调试端口设置

问题描述:

在使用 child_process 模块的 fork 方法创建子进程时,如果主进程(master)是以调试模式启动的,那么当子进程尝试以相同的调试参数启动时,可能会导致调试端口冲突或启动失败。

解决办法:

为了解决这个问题,可以在创建子进程时动态地设置调试端口。这样可以确保每个子进程都有一个独立的调试端口,从而避免端口冲突。

以下是具体的实现代码:

const cp = require('child_process');
const WORKER_PATH = 'worker.js';
const WORKER_NUMBER = 4;

function startWorker(handle) {
    // 检查主进程是否处于调试模式
    const debug = isDebug();

    for (let i = 0; i < WORKER_NUMBER; i++) {
        let child;
        if (debug) {
            // 如果主进程在调试模式下运行,则为每个子进程分配一个独立的调试端口
            child = cp.fork(WORKER_PATH, { execArgv: ['--debug=' + (5858 + i)] });
        } else {
            // 如果主进程不在调试模式下运行,则直接fork子进程
            child = cp.fork(WORKER_PATH);
        }
        child.send({ "server": true }, handle);
        childs.push(child);
    }

    function isDebug() {
        // 检查主进程的执行参数中是否有调试相关的参数
        for (let arg of process.execArgv) {
            if (arg.indexOf('--debug') === 0) {
                return true;
            }
        }
        return false;
    }
}

// 示例调用
startWorker(serverHandle);

代码解释:

  • isDebug() 函数:该函数用于检查当前进程是否处于调试模式。它遍历 process.execArgv 数组,查找是否存在 --debug 参数。
  • startWorker() 函数:该函数负责创建子进程。如果主进程处于调试模式,那么每个子进程将被分配一个独立的调试端口(例如 5858, 5859, 5860, 5861 等)。这样可以避免调试端口冲突。
  • cp.fork() 方法:该方法用于创建一个新的子进程。通过传递 { execArgv: ['--debug=端口号'] } 参数,可以指定子进程的调试参数。

参考链接:

通过这种方式,你可以确保即使主进程处于调试模式,子进程也能正确地启动并分配到独立的调试端口。


在使用 child_process 模块中的 fork 方法来创建子进程时,如果希望子进程能够独立地调试,可以通过传递不同的调试端口号来避免端口冲突。以下是一个简单的示例代码,展示如何为每个子进程分配不同的调试端口。

示例代码

const cp = require('child_process');
const WORKER_PATH = './worker.js'; // 子进程的文件路径
const WORKER_NUMBER = 2;           // 子进程数量

function startWorkers() {
    const debug = isDebug();
    for (let i = 0; i < WORKER_NUMBER; i++) {
        let child = null;
        if (debug) {
            // 如果父进程是调试模式,则为子进程指定一个唯一的调试端口
            child = cp.fork(WORKER_PATH, { execArgv: ['--inspect=' + (9229 + i)] });
        } else {
            // 否则直接启动子进程
            child = cp.fork(WORKER_PATH);
        }
        // 可以在这里添加更多的初始化逻辑
    }
}

function isDebug() {
    // 检查当前进程是否以调试模式启动
    return process.execArgv.some(arg => arg.startsWith('--inspect'));
}

startWorkers();

解释

  • isDebug() 函数:检查当前主进程是否以调试模式启动。如果是,则返回 true,否则返回 false
  • startWorkers() 函数:循环创建指定数量的子进程。如果主进程处于调试模式,为每个子进程指定不同的调试端口(例如,92299230),以避免端口冲突。
  • cp.fork(WORKER_PATH, { execArgv: ['--inspect=' + (9229 + i)] }):使用 fork 创建子进程,并传递不同的调试参数。

注意事项

  • 确保你的操作系统允许打开这么多端口,或者根据需要调整端口号。
  • 调试时可以使用 Chrome 开发者工具连接到指定的端口进行调试。

通过这种方式,你可以确保每个子进程都有自己的调试环境,而不会相互干扰。

回到顶部