pipe不能跨进程吗?
发布于 7 年前 作者 yakczh 3333 次浏览 来自 分享
const cluster=require ('cluster');
  const fs = require('fs');
  if (cluster.isMaster) {
    var logfile=	 fs.createReadStream('access.log');
    var worker=cluster.fork();

    //logfile.pipe(process.stdout);

    worker.on('online', () => {
           console.log('Worker is online');
          logfile.pipe(worker.process.stdout);
    });


 }else {
     console.log(process.pid);
     console.log(process.stdout);
 }

Worker is online _stream_readable.js:495 dest.on(‘unpipe’, onunpipe); ^ TypeError: Cannot read property ‘on’ of null 如果换成

logfile.pipe(process.stdout); 

就正常

6 回复

首先你没有调用cluster.setupMaster来设置的子进程的stdio,所以默认是空的。

其次就算你设置了,后面的逻辑也是错误的。 主进程怎么能向子进程的worker.process.stdout去pipe东西呢,子进程的stdout对于主进程来说肯定是不可写的,只能子进程写自己的stdout。 logfile.pipe(worker.process.stdout);你这里的意思是不是stdin,把读出来的东西写入到子进程的标准输入让子进程处理?

@jiangzhuo 是让master读出来让 worker去处理

cluster.setupMaste 设置 silent:true 以后可以可以取出子进程的stdin 但是这时候子进程中输出任何东西打印都不会显示,没法调试,现在改成 master pipe到文件, 然后子进程再读文件 master输出到文件是可以,但是子进程中 文件读到 stdout不行

const cluster=require ('cluster');
const fs = require('fs');
const filename= './access.log';
if (cluster.isMaster) {
   const net=require ('net');
 var worker=cluster.fork();
   var toWorker=fs.createWriteStream(filename);
  
   net.createServer(function(stream){
       stream.pipe(toWorker);  
  }).listen(80,'127.0.0.1');

}else {
    console.log(process.pid);
    var  myWork=fs.createReadStream(filename);
    myWork.pipe(process.stdout);

}


直接设置stdio 让silent失效,挨个设置stdin stdout stderr

直接设置stdio 让silent失效,挨个设置stdin stdout stderr

@jiangzhuo

cluster.setupMaster({  stdio: ['pipe','pipe','pipe']} );

报异常 throw new TypeError(‘Forked processes must have an IPC channel’);

fork的时候设置stdio

var worker=cluster.fork({  stdio: ['pipe','pipe','pipe']});

还是提示 _stream_readable.js:501 dest.on(‘unpipe’, onunpipe); ^

TypeError: Cannot read property ‘on’ of null

挨个设置 stdin stdout stderr 有代码例子吗?

@yakczh 看文档,最后至少要设置一个IPC

回到顶部