node.js v5.3 child_process.fork偶尔遗失stdout

时间:2016-03-18 06:21:01

标签: javascript node.js stdout stderr child-process

我在node.js中使用child_process来并发处理某个任务,并将main process的stdout stderr传递到某个日志文件中。

console.log中使用console.infochild.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]

这只会偶尔发生。

任何建议都值得赞赏。

0 个答案:

没有答案