工作人员停止向主人发送数据

时间:2017-12-18 11:36:07

标签: node.js node-cluster

我有一个app(master),它将工作分配给n个工人。在worker js内部,我按如下方式挂接了控制台输出:

console._log = console.log;
console._error = console.error;
console.log = (...args) => {
    process.send({
        cmd:'log',
        channel:'out',
        data: args.join(' ')
    });
};

console.error = (...args) => {
    process.send({
        cmd:'log',
        channel:'err',
        data: args.join(' ')
    });
};

master现在负责将所有传入的消息记录到除std之外的文件中。完成以下代码和&模块:

const intercept = require('intercept-stdout');
const stripAnsi = require('strip-ansi');

const unhook_intercept = intercept(function (str) {

    // stdout

    fs.appendFileSync(lib.logOutFile(), stripAnsi(str));

}, function (str) {

    // stderr

    fs.appendFileSync(lib.logErrFile(), stripAnsi(str));

});

我在日志中注意到工作人员在1,5天后停止发送消息。在主人我有工人出口检测:

cluster.on('exit', (worker, code, signal) => {

    if (signal) {

        console.log(`${lib.dateTimeStamp()} - ${chalk.magenta('[')}${chalk.cyan(worker.process.pid)}${chalk.magenta(']')}\tWorker: ${chalk.yellow(`was killed by signal: ${signal}`)}`);

    } else if (code !== 0) {

        console.error(`${lib.dateTimeStamp()} - ${chalk.magenta('[')}${chalk.cyan(worker.process.pid)}${chalk.magenta(']')}\tWorker: ${chalk.red(`exited with error code: ${code}`)}`);

        let newWorker = cluster.fork();
        let data = work[worker.process.pid];
        let d = new Date();

        status[worker.process.pid].status = 'dead';
        status[newWorker.process.pid] = {
            started: `${d.toLocaleDateString()} ${d.toLocaleTimeString()}`,
            status: 'alive'
        };

        delete work[worker.process.pid];

        work[newWorker.process.pid] = data;

        newWorker.send({
            options: cfg.options,
            websites: work[newWorker.process.pid]
        });

    } else {

        delete work[worker.process.pid];
        delete status[worker.process.pid]

        console.log(`${lib.dateTimeStamp()} - ${chalk.magenta('[')}${chalk.cyan(worker.process.pid)}${chalk.magenta(']')}\tWorker: ${chalk.green('exited successfully')}`);

    }

});

我没有在日志中看到退出。目前我只有假设,我希望你的意见。可能是因为:

  1. 同步文件记录。
  2. 一名工人自行断开连接。
  3. 一名工人退出,并且错过了退出活动。
  4. 您的意见......

0 个答案:

没有答案