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);
就正常
首先你没有调用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
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