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

时间:2013-10-10 16:36:38

标签: javascript node.js stream filesystems fs

说我有以下节点程序,一台“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盒子,如果这是相关的。

1 个答案:

答案 0 :(得分:3)

写入实际上不会失败。

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

这就是为什么希望他们的日志文件“消失”的程序(例如,logrotate的b / c)通常支持告诉他们的信号(通常为SIGHUP,有时为SIGUSR1)关闭他们的文件(此时它真的消失了,因为现在没有任何链接到它)并重新创建它。

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