我有一个干净的 Windows 8.1 盒子,安装了最新的 node.js (v0.10.29)。我在两个文件中有以下测试代码:
a.js
var sub = require('child_process').spawn('node', ['b.js'], {silent: true});
sub.stdout.on("data", function (data) {console.log(data.toString());});
b.js
console.log("DEBUG 1");
console.log("DEBUG 2");
process.exit();
如果我执行a.ja
via:
node a.js
我将在控制台输出中看到“DEBUG 1”,但看不到“DEBUG 2”。如果我删除process.exit()
,两行都会正确显示。这种奇怪的行为都会发生fork
and spawn
.
有什么提示吗?相同的代码在linux上运行没有问题。
更新 02.07.2014
似乎这不是 exit() 和 log() 之间的竞争条件,因为将其更改为纯序列会产生相同的错误:
function print(text, next) { console.log(text); next(); }
print("DEBUG 1", function () {
print("DEBUG 2", function () {
process.exit();
});
});
更新 03.07.2014
silent
未列出在spawn()
文档,但它有效。它被列在fork
文档,正如我之前提到的,这个问题与fork
.
看来如果我在最后一个输出和process.exit()
一切正常:
console.log("DEBUG 1");
console.log("DEBUG 2");
setTimeout(function () {process.exit();}, 10000);
但只有当我pipe输出到父进程:如果我删除silent
,即使没有延迟,两条消息也会正确显示,因此很可能是管道通信出现问题,而不是管道通信出现问题process.exit
.
更多更新 2014 年 7 月 3 日
评论中有人猜测process.exit()
可以终止两个进程(都a.ja
and b.ja
)。不,它仅终止生成/分叉的进程,我通过添加无限来检查这一点setTimeout
to a.js
,之后就可以愉快地工作了b.ja
已终止,但仍然没有“DEBUG 2”行。