繁体   English   中英

Node.js文件系统保存文件错误56 EROFS,每2秒保存一次

[英]Node.js filesystem save file error 56 EROFS while saving every 2 seconds

我在raspbian上运行node.js并尝试使用以下代码每2/3秒保存/更新一个文件:

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年前相似的问题。

注意:我正在使用代码中的回调函数来继续主循环。

我能够通过取消链接文件并在每次保存的同时保存文件来实现这一点,而它不是很有效并且不应该导致过多的开销。

我还添加了一个备份解决方案,每隔5分钟保存一次备份,以防保存文件出现问题。

谢谢大家的帮助。

这是我的想法:

1)通过键入终端检查此问题时检查可用空间:

df -h

2)当出现问题时,还要检查文件是否可编辑。 纳米或vim等

3)您的代码太复杂,无法简单地调度数据操作并将其写入文件。 因为你的文件会很忙(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)使用raspberry存储控制器的硬件或软件问题(可能是因为OS驱动程序)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM