我在node.js中使用child_process
来并发处理某个任务,并将main process
的stdout stderr传递到某个日志文件中。
在console.log
中使用console.info
或child.js
时,这些数据偶尔会丢失。
这是我的main.js
:
var fork = require('child_process').fork;
var filePath = './child.js';
function runChild( conf ){
var child = fork(filePath, {
env : {
index : conf.index,
name : conf.name
}
} );
child.on('exit', function(code, signal){
console.log(`[main] child[${conf.name}] exit, code=[${code}], signal=[${signal}]`);
});
child.unref();
}
for( var i = 0, len = 4; i < len; i++ ){
runChild({
index : i,
name : 'child_' + i
});
}
和child.js
:
var index = process.env.index;
var name = process.env.name;
setTimeout(function(){
console.info(`[child] run in child: index=[${index}]`);
setTimeout(function(){
console.info(`[child] before exit: index=[${index}]`);
process.exit(0);
}, 1000);
}, 1000);
运行node main.js > log.txt 2>&1
,有时log.txt看起来像:
[child] run in child: index=[0]
[child] run in child: index=[3]
[child] run in child: index=[1]
[child] run in child: index=[2]
[child] before exit: index=[0]
[main] child[child_0] exit, code=[0], signal=[null]
[child] before exit: index=[3]
[main] child[child_3] exit, code=[0], signal=[null]
[child] before exit: index=[1]
[main] child[child_1] exit, code=[0], signal=[null]
[child] before exit: index=[2]
有时输出是这样的:
[child] run in child: index=[0]
[child] run in child: index=[1]
[child] run in child: index=[2]
[child] run in child: index=[3]
[child] before exit: index=[0]
[main] child[child_0] exit, code=[0], signal=[null]
[main] child[child_2] exit, code=[0], signal=[null]
[main] child[child_3] exit, code=[0], signal=[null]
[main] child[child_1] exit, code=[0], signal=[null]
这只会偶尔发生。
任何建议都值得赞赏。