NodeJS文件系统两次或更频繁地观察抛出事件

Posted

技术标签:

【中文标题】NodeJS文件系统两次或更频繁地观察抛出事件【英文标题】:NodeJS Filesystem Watch throwing event twice or more often 【发布时间】:2012-06-18 09:29:08 【问题描述】:

我正在 Ubuntu 上查看我的 NodeJS 服务器的配置文件:

for( var index in cfgFiles ) 
    fs.watch(cfgFiles[index], function(event, fileName) 
        logger.info("======> EVENT: " + event);
        updateConfigData(fileName);
    );

因此,每当我保存配置文件时,相同文件名的处理函数至少会收到两次“更改”事件,从而导致 updateConfigData() 被执行多次。我在使用 C++/iNotify 观看配置文件时遇到了同样的行为。

有人知道导致这种行为的原因吗?

【问题讨论】:

你有机会检查一下情况吗?你的问题和我下面解释的一样吗?如果您需要对我的回答进行任何澄清,请通过发表评论告诉我。 我的回答没有解决你的问题吗? 对不起,hasanyasin,我在另一个项目领域很忙,但一定会回来的。 【参考方案1】:

简答:不是Node,文件真的改了两次。

长答案

我有一个非常相似的方法用于我的开发设置。如果是开发机器,我的 manager 进程会监视所有 js 源文件,并在集群上重新启动子进程。

我没有注意这个,因为它只是开发设置;但是在阅读了您的问题后,我看了一下并意识到我有同样的行为。

我在本地计算机上编辑文件,我的编辑器在我保存时通过 sftp 更新它们。每次保存时,文件上的更改事件都会触发两次。

我检查了由 fs.watch 调用返回的 FSWatcher 对象的 listeners('change');但它只显示我的事件处理程序一次。

然后我做了我应该先做的测试:服务器上的“touch file.js”,它只触发了一次。所以,对我来说,它不是 Node,而是 Node。但文件真的被改变了两次。当打开文件进行写入(而不是追加)时,它可能会触发更改,因为它会清空内容。然后在写入新内容时,会再次触发该事件。

这对我没有任何问题;但是如果你想阻止它,你可以在你的事件处理函数中进行奇偶控制,方法是保留每个文件的调用号,并只在偶数索引调用上做任何你做的事情。

【讨论】:

【参考方案2】:

请参阅my response to a similar question,其中说明问题是由编辑器在保存时对文件进行多次编辑引起的。

【讨论】:

以上是关于NodeJS文件系统两次或更频繁地观察抛出事件的主要内容,如果未能解决你的问题,请参考以下文章

如何读取 BufferedReader 两次或多次?

如何强制事件跟踪会话更频繁地刷新数据?

6 张图带你搞懂 TCP 为什么是三次握手,而不是两次或四次?

nodejs需要事件来对象

观察频繁的日志文件切换,尽管增加了重做日志的大小

nodeJs巨大的数组处理抛出RangeError:超过最大调用堆栈大小