node.js中的子进程在同步代码行之间神秘退出
node.js中的子进程有一个奇怪的问题,我有一些代码在这样的子进程中运行,但是子进程在同步代码行之间退出,代码为0。node.js中的子进程在同步代码行之间神秘退出,node.js,asynchronous,child-process,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 =
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");
不跑。子进程在该行代码之前退出。我完全不知道为什么。任何洞察都将不胜感激
另外,如果我更改这两条语句的顺序,它在退出之前仍然只执行第一条语句
编辑
所以,也许它确实与冲洗和其他臭虫有关。如果我删除这两条连续的日志语句,它将在finally
块中运行下一条日志语句,然后退出
EDIT2
关于这个问题还有其他一些奇怪的地方。您可以在代码片段中看到我有一个名为globalI
稍后在代码中,该变量会简单地递增,就像globalI++代码>
如果取消对增量的注释,子进程将意外停止退出,但这毫无意义,因为它甚至从未接近增量意外退出时发生的行
这就是我开始有这个问题的原因。我完全震惊了你终于错过了一个}之后,但我非常严重地怀疑这与此有关,可能只是一个复制过去的错误
在我看来,在刷新stdout之前,您可能已经退出了该程序。以前有一个flush调用,您可以在较旧的节点版本中显式地进行,但现在不行了
阅读这篇文章,人们与你的问题非常相似:
这似乎很难相信,因为在此之后您正在进行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);
});
@我不确定,但我不认为这是我的问题。文件中还有其他无法执行的同步命令。我同意你的观点,我认为如果不是不可能的话,很难相信这是我的错误。还有许多其他同步命令没有在文件中进一步运行。我在log语句之前直接添加了setTimeout
代码行,它可能会运行,但不会结束,因为它从不打印Timeout代码>仍与以前一样,它打印仍在运行的
,然后以代码0退出。另外,process.on('uncaughtException')
没有捕获任何内容。我在原始问题中添加了一个编辑,这可能会有所帮助