Node.js:检测一个用fs.createWriteStream()打开的文件,将被删除

说我有下面的节点程序,一台机器“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); 

每秒都会向控制台输出一条消息,并将其附加到一个日志文件(如果需要,它将在启动时创build)。 这一切都很好。

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

我怎样才能检测到我正在写的文件被删除,所以我可以尝试重新打开或重新创build文件? 这是一个CentOS盒子,如果这是相关的。

写入实际上不会失败。

当您删除在另一个程序中打开的文件时,您正在删除该文件的inode的指定链接。 开放的程序仍然指向 inode。 它会高兴地写下来,实际写入磁盘。 只有现在没有办法看,因为你删除了对它的命名引用。 (如果还有其他的参考资料,例如硬链接,你仍然可以!)。

这就是为什么期望他们的日志文件“消失”(比如logrotate b / c)的程序通常会支持一个信号(通常是SIGHUP ,有时是SIGUSR1 ),告诉他们closures它们的文件(在这一点上,没有链接到任何地方),并重新创build它。

你也应该考虑这样的事情。