node.js中的子进程在同步代码行之间神秘地退出

时间:2013-07-10 14:07:49

标签: node.js asynchronous child-process

我在node.js中遇到了一个奇怪的子进程问题我在这样的子进程中运行了一些代码,但子进程在同步代码行之间以代码0 退出。

var fs = require('fs');
var http = require('http');
var mkdirp = require('mkdirp');


var urlPath = __dirname + "\\urls.txt";
var savePath = __dirname + "\\";
var objects = [];
var globalI = 0;

var file;

if (!fs.existsSync(urlPath))
{
    console.log("File at " + urlPath + " does not exist!");
}
else 
{
    if(!fs.existsSync(savePath)){
        mkdirp.sync(savePath);
    }

    console.log("File found! Reading...");
    console.log("still running");

    try{
        var data = fs.readFileSync(urlPath, {"encoding":"utf8"});
    } catch (err) {
        console.log("Error reading url file...");
        throw err;
    } finally {
        console.log("File read!");
        var array = data.split("\n");

        console.log("Found " + array.length + " urls");
    }

该行

console.log("File found! Reading...");

运行并显示在控制台中。不过下一行

console.log("still running");

没有运行。子进程在该代码行之前退出。我完全不知道为什么。任何见解都会非常感激!

另外,如果我改变两个语句的顺序,它仍然只在退出之前执行第一个语句。

修改

所以也许它确实与刷新和其他bug有关。如果我删除这两个连续的日志语句,它将运行finally块中的下一个日志语句,然后退出。

EDIT2

这个问题还有其他一些好奇心。你可以在代码片段中看到我有一个名为globalI的变量 稍后在代码中,该变量就像globalI++;一样递增 如果我取消注释增量,子进程会意外停止退出但这没有任何意义,因为它甚至从未接近到意外退出时增量发生的行。

这实际上是我开始遇到这个问题的方式。我完全被惊呆了

1 个答案:

答案 0 :(得分:2)

你终于错过了一个},但我非常怀疑这与它有什么关系,可能只是过去的错误。

在我看来你可能会在刷新stdout之前退出程序。曾经有一个您可以在旧节点版本中明确进行的刷新调用,但不再是。

阅读此帖子,其中人们遇到的问题非常类似:

https://github.com/joyent/node/issues/1669

基于你之后正在进行readFileSync调用的事实,这似乎很难相信,但我认为它仍然有可能。

你可以做的一件事就是测试它是在你写两个荒谬的事情之前设置一个超时,比如5秒。这将使程序保持活动状态5秒,足以让任何控制台日志被刷新。

...
setTimeout(function() { console.log("Timeout!!");  }, 5000);
console.log("File found! Reading...");
console.log("still running");
...

如果两条线都出来了,那么你知道你有时间问题。如果它在此之后仍然被破坏,至少你可以将时间安排作为一个问题。

也许你以某种方式得到一个未处理的错误。您可以输入以下代码并查看它是否被触发:

process.on('uncaughtException', function (err) {
  console.error('uncaught: ' + err);
});