Javascript Node.js文件系统每2秒保存文件时发生56 EROFS错误
我正在raspbian上运行node.js,并尝试使用以下代码每2/3秒保存/更新一个文件:Javascript Node.js文件系统每2秒保存文件时发生56 EROFS错误,javascript,node.js,raspberry-pi,raspbian,raspberry-pi3,Javascript,Node.js,Raspberry Pi,Raspbian,Raspberry Pi3,我正在raspbian上运行node.js,并尝试使用以下代码每2/3秒保存/更新一个文件: var saveFileSaving = false; function loop() { mainLoop = setTimeout(function() { // update data saveSaveFile(data, function() { //console.log("Saved data to file");
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>' }
[25/May/2016 11:3:4 am]{[错误:EROFS,打开“”]
呃:56,,
代码:“EROFS”,
路径:'}
我尝试过jsonfile插件,它在一小时后也会发出类似的写入错误
我尝试了fileSystem.writeFile和fileSystem.writeFileSync,两个文件都在一小时后出现了相同的错误
我认为这与处理程序在新的保存发生之前没有被释放有关,这就是为什么我开始使用saveFileSaving标志
通过硬复位重置系统解决了问题(软复位不起作用,因为系统似乎被锁定)
有什么建议吗?我在网上搜索过,所以只发现了一个与4年前稍有相似的问题,这个问题仍然悬而未决
注意:我使用代码中的回调函数继续主循环。以下是我的想法:
1) 当出现此问题时,通过键入terminal:
df -h
2) 当问题发生时,还要检查文件是否可编辑。使用nano或vim等
3) 您的代码太复杂,无法简单地安排数据操作并将其写入文件。因为即使是您的文件也会很忙(SaveFileSaveing),所以在下一次迭代之前您将丢失数据,请尝试使用该代码:
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) raspberry的存储控制器出现硬件或软件问题(可能是因为操作系统驱动程序)。我可以通过取消文件链接并在每次保存时保存文件来实现这一点,虽然它不太好,但它可以正常工作,并且不会造成太多开销 我还添加了一个备份解决方案,它每5分钟保存一次备份,以防保存文件出现问题
感谢大家的帮助。只读文件系统?我相信在保存过程中会发生一些事情,会弄乱已装入的驱动器,并以某种方式将已装入的驱动器更改为只读。因为硬重置可以解决问题,所以哪种方法是有意义的。但在文件保存过程中,是什么导致了这种变化呢?挂载中有一个标记,叫做“错误时重新挂载ro”,如果有,可能是check fstab?或者在没有任何参数的情况下运行mount命令来获取列表。下次出现时,我将检查空间,但文件为3kb,并且始终在10kbHey mate下。在运行应用程序并遇到相同的问题后,我尝试运行建议的命令,但我无法执行。终端只是挂起,什么也不做。唯一有效的命令是cd。我对你的想法很感兴趣,但这会不会不经常将数据附加到文件中?我希望每次编写时都替换文件。关于替换:来自(3)的示例。关于问题:2个原因:a。硬件问题,b。没有可用空间,可能是因为交换,或者可能是日志文件…下一步我将尝试(3),可用空间不应该是一个问题,因为我只使用了32gb的15%。还有什么方法可以确认硬件问题吗?尝试将文件写入其他位置、外部HDD或连接dropbox