7

假设我有以下节点程序,一台机器会“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);

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

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

如何检测我正在写入的文件何时被删除,以便我可以尝试重新打开或重新创建文件?这是一个 CentOS 盒子,如果相关的话。

4

1 回答 1

8

写入实际上不会失败。

当您删除在另一个程序中打开的文件时,您正在删除指向该文件 inode 的命名链接。打开它的程序仍然指向那个inode。它会很高兴地继续写入它,实际上是写入磁盘。只是现在无法查看它,因为您删除了对它的命名引用。(如果有其他参考,例如硬链接,您仍然可以!)。

就是为什么期望它们的日志文件“消失”(例如b logrotate/ c链接到它的任何地方)并重新创建它。SIGHUPSIGUSR1

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

于 2013-10-10T19:12:02.200 回答