以编程方式在 linux 上触发 inotify 事件

Posted

技术标签:

【中文标题】以编程方式在 linux 上触发 inotify 事件【英文标题】:Programmatically Trigger an inotify event on linux 【发布时间】:2015-09-22 20:46:47 【问题描述】:

在主机操作系统上更改文件时,在 VirtualBox(或几乎任何虚拟机)上使用共享文件夹不会触发来宾操作系统上的 inotify 事件。

但是,如果可以通过编程方式触发 inotify 事件,那么我可以编写一些东西(virtualbox 插件、客户端/服务器等)来告诉 linux(在本例中为 Ubuntu)文件已更改。这将允许任何监视文件更改的现有软件(ruby 的警卫、python 的看门狗、节点监视程序等)与共享文件夹一起使用并提高开发速度。

语言无关紧要(但考虑到跨主机操作系统的易于安装,更喜欢节点)。如果有人知道如何完成将不胜感激。

【问题讨论】:

如果你所追求的东西是不可能的(idk),你可以尝试在计时器上进行轮询 - 所以说每 10 秒你列出目录中的内容并手动比较修改日期的戳记. 欣赏这个想法,但守卫、观察者等已经为这些类型的情况内置了轮询。轮询的问题在于,在大型项目中,它会占用大量 CPU,而且速度可能非常慢。 显而易见的问题是,您在来宾 vm 上安装了 virtualbox 工具/驱动程序,对吧? 感谢@SnakeDoc,但 inotify 事件不会在共享驱动器上触发。 virtualbox 的解释在这里virtualbox.org/ticket/10660。没有任何情况可以让这发生。唯一的解决方案是在主机上运行侦听器并将活动转发给来宾并利用您正在使用的任何软件(例如:守卫)。但是你必须为每个软件编写这个。如果您可以通过编程方式触发 inotify,那么这些软件就可以正常工作,而无需为您要使用的每个软件编写插件。 4 年后。这是我对 nodejs 的每个 OP 请求所做的事情。在主机/服务器 chokidar 上运行目录监视 + tcp 套接字,在文件更改时推送。在客户端/来宾上,在同一端口上运行 tcp 套接字并监听。然后通过配置文件或解析 /etc/mtab 使用下面的答案在本地文件路径上触发 inotify。 【参考方案1】:
sed '' -i filename

这个命令会触发一个inotify change事件,但不会改变文件的内容

【讨论】:

【参考方案2】:

touch -r file.ext file.ext

这将“更新”文件的修改时间,但会将其设置为它自己现有的修改时间。因此,文件或其元数据实际上并没有发生任何变化,但 inotify 看到了“变化”。

【讨论】:

以上是关于以编程方式在 linux 上触发 inotify 事件的主要内容,如果未能解决你的问题,请参考以下文章

linux inotify - 确定触发事件的用户

Linux下inotify监控文件夹状态,发生变化后触发rsync同步

以编程方式在音频元素上设置当前 Date 属性会导致事件侦听器无限期触发

PWA:如何以编程方式触发:“添加到主屏幕”?在 iOS Safari 上

以编程方式触发 jsdom 窗口中的滚动或按键事件

惊雷Linux下rsync+inotify的实时文件自动同步