假设我有以下 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);
每秒,它都会向控制台打印一条消息,并将其附加到日志文件(如果需要,它将在启动时创建日志文件(。一切都很好。
但是现在,如果我在进程运行时删除machine.log
文件,它将继续愉快地嗡嗡作响,但写入将不再成功,因为文件已消失。但看起来写入以静默方式失败,这意味着我需要显式检查这种情况。我已经搜索了 Stream 文档,但似乎找不到发生此类事情时发出的明显事件。write()
的返回值也没有用。
如何检测我正在写入的文件何时被删除,以便我可以尝试重新打开或重新创建该文件?这是一个 CentOS 盒子,如果相关的话。
写入实际上不会失败。
删除在另一个程序中打开的文件时,将删除指向该文件 inode 的命名链接。打开它的程序仍然指向该索引节点。它会很高兴地继续写入它,实际上是写入磁盘。只是现在你没有办法查看它,因为你删除了对它的命名引用。(如果有其他参考,例如硬链接,您仍然可以!
这就是为什么期望他们的日志文件"消失"的程序(比如logrotate
的b/c(通常支持一个信号(通常是SIGHUP
,有时是SIGUSR1
(,告诉他们关闭他们的文件(此时它真的消失了,因为现在任何地方都没有指向它的链接(并重新创建它。
你也应该考虑这样的事情。