基于inotify的文件监控方案

2024-02-24 05:08
文章标签 监控 方案 inotify

本文主要是介绍基于inotify的文件监控方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在做一个linux上的文件监控程序,2.6内核提供了inotify机制,这仅仅是个机制,任何策略都必须自己实现,这一点从inotify不提供递归接口就可以看出来,如果我实时监控到目录被创建,那么马上将这个新目录加入监控表,这个想法是最初的想法,也是最直接的想法,可是仔细推敲一下就会发现这个实现有问题,比如在检测到目录被创建到新目录添加到监控表的时间间隔内,新的子目录的文件事件以及目录事件将被遗漏,而且会像丝袜脱丝一样一发不可收拾,新子目录内又创建了一个目录没有被监控到,那么这个子子目录内的事件将递归的丢失,看来这个事情很严重,那么有没有办法呢?前面说了一种补救的办法,可是难度太大,没有必要,仔细想想这种丢失并不是频繁发生,只有在像cp -r或者tar快速创建目录时才会发生,既然我们没有办法实现补救方案,那么可以从进程执行这个大框架入手,如果我们可以让cp或者tar在监控程序加入新目录之前不执行就可以了,于是可以通过优先级来实现,将监控程序设置为实时FIFO优先级就可以了。当文件系统的系统调用执行完,inotify开始执行的时候,最后会wake up等待inotify描述符的监控进程,而在系统调用返回用户空间的时候会检查need_sched标志位,因为监控进程是实时调度类,优先级是很高的,因此必定会抢占当前的文件操作的进程,可是在多cpu上怎么能保证这个文件操作进程不被调度到别的cpu上呢?说实话,不能,于是有了下面的解决方案。

文件同步方案已经找到,还是用inotify,利用inotify-tools工具的inotifywait程序对目录进行监控,并且实时加入新创建的子目录,为了避免遗漏,我的做法是:

单cpu方案:

解决办法:将监控进程的优先级设置为FIFO实时优先级,根据inotify的内核实现和2.6内核的进程调度原理(根据是2.6.X的内核源代码),实时优先级的监控进程总是可以在新子目录创建文件前首先加入该子目录,这样就不会遗漏了。

多cpu方案:

问题:因为在多cpu的情况下,即使将监控进程设置为FIFO的实时进程,那么还是可能将cp -r或者tar等快速创建子目录和文件的进程调度到别的cpu,从而和我们的监控进程构成竞争最终造成事件遗漏。

解决办法:将监控进程分解为多个线程,每个cpu绑定一个线程,这些线程共享一个inotify描述符,这样就不会造成读取的事件重复。如此一来,在新目录被添加以后,每个cpu上的均会运行实时FIFO线程,从而把任何非实时进程的执行拦截。在多cpu上,实际只要有一个文件操作,就会唤醒所有cpu上的监控进程,这是靠ipi(处理器间中断)实现的。

效果:经过测试,发现没有遗漏。

仍然具有的问题:从内核源代码来看,如果没有将内核编译成内核抢占,那么还是有可能遗漏,只不过这种可能性非常之小,我用tar和cp -r没有测试出来。

虽然每个cpu一个监控进程解决了大致框架问题,但是又引入了新的问题,怎么处理这么多的进程间的通信,inotifywait是用红黑树实现的文件索引,那么多的线程肯定会打乱红黑树的,于是又有了新的想法。想想看设置多个线程,每个cpu一个线程的原因就是靠这些线程的优先级是实时FIFO来阻止新目录加入监控表前的文件操作,于是我们只要保证一个cpu上进行实际工作,别的cpu上的线程不做任何监控,只是一个桩就可以了,现在问题就是这个桩怎么设计,很简单,办法有两个,一个就是在别的cpu的线程随便实现一个无限的等待循环,另一个方案就是在别的cpu上执行inotify描述符的select而不做read,这种方案一定可以,相信我没错的。

这篇关于基于inotify的文件监控方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/741016

相关文章

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

springboot2.1.3 hystrix集成及hystrix-dashboard监控详解

《springboot2.1.3hystrix集成及hystrix-dashboard监控详解》Hystrix是Netflix开源的微服务容错工具,通过线程池隔离和熔断机制防止服务崩溃,支持降级、监... 目录Hystrix是Netflix开源技术www.chinasem.cn栈中的又一员猛将Hystrix熔

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

MySQL容灾备份的实现方案

《MySQL容灾备份的实现方案》进行MySQL的容灾备份是确保数据安全和业务连续性的关键步骤,容灾备份可以分为本地备份和远程备份,主要包括逻辑备份和物理备份两种方式,下面就来具体介绍一下... 目录一、逻辑备份1. 使用mysqldump进行逻辑备份1.1 全库备份1.2 单库备份1.3 单表备份2. 恢复

redis中session会话共享的三种方案

《redis中session会话共享的三种方案》本文探讨了分布式系统中Session共享的三种解决方案,包括粘性会话、Session复制以及基于Redis的集中存储,具有一定的参考价值,感兴趣的可以了... 目录三种解决方案粘性会话(Sticky Sessions)Session复制Redis统一存储Spr

SpringBoot实现虚拟线程的方案

《SpringBoot实现虚拟线程的方案》Java19引入虚拟线程,本文就来介绍一下SpringBoot实现虚拟线程的方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录什么是虚拟线程虚拟线程和普通线程的区别SpringBoot使用虚拟线程配置@Async性能对比H