Node.js:检测到一个文件,该文件通过fs.createWriteStream()打开,已被删除

smi*_*lli 2 javascript filesystems stream fs node.js

假设我有以下Node程序,该机器运行“ Ping!”:

var machine = require('fs').createWriteStream('machine.log', {
    flags    : 'a',
    encoding : 'utf8',
    mode     : 0644
});

setInterval(function () {
    var message = 'Ping!';
    console.log(message);
    machine.write(message + '\n');
}, 1000);
Run Code Online (Sandbox Code Playgroud)

每秒,它将打印一条消息到控制台,并将其附加到日志文件(如果需要,它将在启动时创建)。一切都很好。

但是现在,如果我machine.log在进程运行时删除文件,它将继续愉快地嗡嗡作响,但是由于文件已消失,写入将不再成功。但是看起来写操作无声地失败了,这意味着我将需要显式检查这种情况。我已经搜索了Stream文档,但似乎找不到此类事件发生时发出的明显事件。的返回值write()也没有用。

如何检测何时删除正在写入的文件,以便尝试重新打开或重新创建该文件?如果需要的话,这是一个CentOS框。

Nit*_*ked 5

写入实际上不会失败。

删除在另一个程序中打开的文件时,将删除到该文件的inode的命名链接。打开它的程序仍指向该索引节点。它会很乐意继续对其进行写入,实际上是写入磁盘。只是现在还没有办法查看它,因为您删除了对此的命名引用。(如果还有其他参考,例如硬链接,您仍然可以!)。

这就是为什么期望其日志文件“消失”(例如,b / c的程序logrotate)通常会支持一个信号(通常SIGHUP,有时是SIGUSR1),该信号告诉他们关闭文件(这时它实际上已经消失了,因为现在没有了)链接到任何地方)并重新创建。

您也应该考虑类似的事情。