Node.js 文件系统保存文件错误 56 EROFS,同时每 2 秒保存一次
Node.js filesystem save file error 56 EROFS while saving every 2 seconds
我在 raspbian 上 运行ning node.js 并尝试使用以下代码每 2/3 秒 save/update 一个文件:
var saveFileSaving = false;
function loop() {
mainLoop = setTimeout(function() {
// update data
saveSaveFile(data, function() {
//console.log("Saved data to file");
loop();
});
}, 1500);
}
function saveSaveFile(data, callback) {
if(!saveFileSaving) {
saveFileSaving = true;
var wstream = fs.createWriteStream(path.join(__dirname, 'save.json'));
wstream.on('finish', function () {
saveFileSaving = false;
callback(data);
});
wstream.on('error', function (error) {
console.log(error);
saveFileSaving = false;
wstream.end();
callback(null);
});
wstream.write(JSON.stringify(data));
wstream.end();
} else {
callback(null);
}
}
当我 运行 它工作正常一个小时然后开始吐出:
[25/May/2016 11:3:4 am] { [Error: EROFS, open '<path to file>']
errno: 56,
code: 'EROFS',
path: '<path to file>' }
我试过 jsonfile 插件,它在一个小时后也发出了类似的写入错误。
我试过 fileSystem.writeFile 和 fileSystem.writeFileSync 都在一个小时后给出了同样的错误。
我认为这与处理程序在新保存发生之前不被释放有关,这就是我开始使用 saveFileSaving 标志的原因。
通过硬重置重置系统修复了该问题(软重置不起作用,因为系统似乎被锁定)。
大家有什么建议吗?我在网上搜索了一下,只发现了一个与 4 年前略有相似的问题,但一直悬而未决。
注意:我正在使用代码中的回调函数继续主循环。
这是我的想法:
1) 当出现此问题时,请在终端中输入
检查免费 space
df -h
2) 出现问题时还要检查文件是否可编辑。使用 nano 或 vim 等
3) 您的代码过于复杂,无法简单地安排数据操作并将其写入文件。因为 even Your file will be busy (saveFileSaving) 你将在下一次迭代之前丢失数据,请尝试使用该代码:
var
async = require('async'),
fs = require('fs'),
path = require('path');
async.forever(function(next) {
// some data manipulation
try {
fs.writeFileSync(path.join(__dirname, 'save.json'), JSON.stringify(data));
}
catch(ex) {
console.error('Error writing data to file:', ex);
}
setTimeout(next, 2000);
});
4) 保持文件描述符打开如何?
var
async = require('async'),
fs = require('fs'),
path = require('path');
var file = fs.createWriteStream(path.join(__dirname, 'save.json'));
async.forever(function(next) {
// some data manipulation
file.write(JSON.stringify(data));
setTimeout(next, 2000);
});
var handleSignal = function (exc) {
// close file
file.end();
if(exc) {
console.log('STOPPING PROCESS BECAUSE OF:', exc);
}
process.exit(-1);
}
process.on('uncaughtException', handleSignal);
process.on('SIGHUP', handleSignal);
5) 树莓派存储控制器的硬件或软件问题(可能是因为 OS 驱动程序)。
我可以通过取消链接文件并在每次保存时保存文件来使它正常工作,虽然它不太好用,但不会造成太多开销。
我还添加了一个备份解决方案,每 5 分钟保存一次备份,以防保存文件出现问题。
感谢大家的帮助。
我在 raspbian 上 运行ning node.js 并尝试使用以下代码每 2/3 秒 save/update 一个文件:
var saveFileSaving = false;
function loop() {
mainLoop = setTimeout(function() {
// update data
saveSaveFile(data, function() {
//console.log("Saved data to file");
loop();
});
}, 1500);
}
function saveSaveFile(data, callback) {
if(!saveFileSaving) {
saveFileSaving = true;
var wstream = fs.createWriteStream(path.join(__dirname, 'save.json'));
wstream.on('finish', function () {
saveFileSaving = false;
callback(data);
});
wstream.on('error', function (error) {
console.log(error);
saveFileSaving = false;
wstream.end();
callback(null);
});
wstream.write(JSON.stringify(data));
wstream.end();
} else {
callback(null);
}
}
当我 运行 它工作正常一个小时然后开始吐出:
[25/May/2016 11:3:4 am] { [Error: EROFS, open '<path to file>']
errno: 56,
code: 'EROFS',
path: '<path to file>' }
我试过 jsonfile 插件,它在一个小时后也发出了类似的写入错误。
我试过 fileSystem.writeFile 和 fileSystem.writeFileSync 都在一个小时后给出了同样的错误。
我认为这与处理程序在新保存发生之前不被释放有关,这就是我开始使用 saveFileSaving 标志的原因。
通过硬重置重置系统修复了该问题(软重置不起作用,因为系统似乎被锁定)。
大家有什么建议吗?我在网上搜索了一下,只发现了一个与 4 年前略有相似的问题,但一直悬而未决。
注意:我正在使用代码中的回调函数继续主循环。
这是我的想法:
1) 当出现此问题时,请在终端中输入
检查免费 spacedf -h
2) 出现问题时还要检查文件是否可编辑。使用 nano 或 vim 等
3) 您的代码过于复杂,无法简单地安排数据操作并将其写入文件。因为 even Your file will be busy (saveFileSaving) 你将在下一次迭代之前丢失数据,请尝试使用该代码:
var
async = require('async'),
fs = require('fs'),
path = require('path');
async.forever(function(next) {
// some data manipulation
try {
fs.writeFileSync(path.join(__dirname, 'save.json'), JSON.stringify(data));
}
catch(ex) {
console.error('Error writing data to file:', ex);
}
setTimeout(next, 2000);
});
4) 保持文件描述符打开如何?
var
async = require('async'),
fs = require('fs'),
path = require('path');
var file = fs.createWriteStream(path.join(__dirname, 'save.json'));
async.forever(function(next) {
// some data manipulation
file.write(JSON.stringify(data));
setTimeout(next, 2000);
});
var handleSignal = function (exc) {
// close file
file.end();
if(exc) {
console.log('STOPPING PROCESS BECAUSE OF:', exc);
}
process.exit(-1);
}
process.on('uncaughtException', handleSignal);
process.on('SIGHUP', handleSignal);
5) 树莓派存储控制器的硬件或软件问题(可能是因为 OS 驱动程序)。
我可以通过取消链接文件并在每次保存时保存文件来使它正常工作,虽然它不太好用,但不会造成太多开销。
我还添加了一个备份解决方案,每 5 分钟保存一次备份,以防保存文件出现问题。
感谢大家的帮助。