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 分钟保存一次备份,以防保存文件出现问题。

感谢大家的帮助。