说我有以下节点程序,一台“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 docs,但似乎找不到发生此类事件时发出的明显事件。 write()
的返回值也没用。
如何检测我正在写入的文件何时被删除,以便我可以尝试重新打开或重新创建该文件?这是一个CentOS盒子,如果这是相关的。
答案 0 :(得分:3)
写入实际上不会失败。
当您删除在另一个程序中打开的文件时,您正在删除该文件的inode的命名链接。打开的程序仍然指向到该inode。它会很乐意继续写它,实际写入磁盘。只有现在你没有办法查看它,因为你删除了对它的命名引用。 (如果有其他参考文献,例如硬链接,你仍然可以!)。
这就是为什么希望他们的日志文件“消失”的程序(例如,logrotate
的b / c)通常支持告诉他们的信号(通常为SIGHUP
,有时为SIGUSR1
)关闭他们的文件(此时它真的消失了,因为现在没有任何链接到它)并重新创建它。
你也应该考虑这样的事情。