我遇到了子进程模块的问题,特别是child.spawn和child.fork。 我依赖于child_process.fork的文档,其中说:
这是child_process.spawn()功能的特例 产生Node.js进程。除了拥有所有方法 正常的ChildProcess实例,返回的对象有通信 频道内置。有关详细信息,请参阅child.send(message,[sendHandle])。
我在下面简化了我的问题:
parent.js是:
var cp = require('child_process');
var n = cp.fork('./child.js');
n.send({a:1});
//n.stdout.on('data',function (data) {console.log(data);});
n.on('message', function(m) {
console.log("Received object in parent:");
console.log( m);
});
child.js是:
process.on('message', function(myObj) {
console.log('myObj received in child:');
console.log(myObj);
myObj.a="Changed value";
process.send(myObj);
});
process.stdout.write("Msg from child");
正如所料。输出是:
Msg from child
myObj received in child:
{ a: 1 }
Received object in parent:
{ a: 'Changed value' }
我希望它能够在parent.js中的注释行中取消注释。换句话说,我想在父进程中的n.stdout.on(&#39; data&#39; ...语句)中捕获子进程中的stdout。如果我取消注释它,我会收到错误:< / p>
n.stdout.on('data',function (data) {console.log(data);});
^
TypeError: Cannot read property 'on' of null
我不介意使用任何子进程异步变量,exec,fork或spawn。有什么建议吗?
答案 0 :(得分:28)
当你将它传递给fork()时,你需要在options对象上设置silent属性,以便stdin,stdout和stderr被传送回父进程。
e.g。 var n = cp.fork('./child.js', [], { silent: true });
答案 1 :(得分:0)
spawn('stdbuf', ['-i0', '-o0', '-e0', "./test-script" ]);