gpt4 book ai didi

javascript - Node.js:检测文件,用 fs.createWriteStream() 打开,被删除

转载 作者:搜寻专家 更新时间:2023-11-01 00:25:39 25 4
gpt4 key购买 nike

假设我有以下 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 docs但似乎无法找到发生此类事件时发出的明显事件。 write() 的返回值也没有用。

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

最佳答案

写入实际上不会失败。

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

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

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

关于javascript - Node.js:检测文件,用 fs.createWriteStream() 打开,被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19301438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com