inotify学习

2024-01-31 06:04
文章标签 学习 inotify

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

inotify的原理

`inotify`是Linux内核的一个子系统,它提供了一个通用的框架来监控文件系统的变化。使用`inotify`,应用程序可以订阅和获取文件或目录状态变化的通知,如文件写入、读取、创建、删除、属性更改等。

`inotify`的工作原理分为以下几个步骤:

1. **初始化**:应用程序使用`inotify_init`系统调用来初始化一个`inotify`实例,该调用返回一个文件描述符。

2. **定义监控对象**:应用程序使用`inotify_add_watch`系统调用为指定的文件或目录添加一个监视描述符。在这个调用中,应用程序可以指定需要监听的事件类型。

3. **事件通知**:当被监视的文件或目录发生变化时,内核将事件添加到与`inotify`实例关联的队列中。

4. **读取通知**:应用程序使用`read`系统调用读取文件描述符来获取事件通知。

5. **移除监控对象**:应用程序使用`inotify_rm_watch`系统调用停止监视文件或目录。

这个机制允许应用程序以事件驱动的方式处理文件系统的变化,而不是不断的轮询文件系统状态,显著提高了效率。这对于文件同步、备份、索引等应用程序特别有用。

然而,需要注意的是`inotify`也有一些限制和需要注意的问题。例如,`inotify`不会继承文件或目录的监听状态,也就是说,如果创建了一个新的子目录,你需要为新的子目录添加新的监听。此外,`inotify`的事件是一次性的,也就是说,如果不重新添加监听,一次事件触发后就不再有效。而且,`inotify`有一定的资源限制,监听总数过大可能会造成问题。

inotifywait的用法,不需要一直注册事件吧?

`inotifywait`是一个用于使用`inotify`接口的命令行工具,它消除了直接使用`inotify` API时的许多复杂性。使用`inotifywait`,你可以很容易地设置一个脚本来监视文件系统的更改,并在更改发生时执行某些操作。

你的理解是正确的:你不需要在每次事件发生后重新注册。只要使用`inotifywait`命令的`-m`或`--monitor`选项,你就可以让`inotifywait`持续地等待事件的发生,而不是在第一个事件后就退出。

例如,以下命令将持续监视`/path/to/dir`目录(及其所有子目录,由于`-r`选项)的所有文件修改事件,并将相关的事件信息打印到标准输出:

inotifywait -m -r -e modify /path/to/dir

在这个命令中,`-m`选项让`inotifywait`在事件发生后继续等待,`-r`选项使得命令递归地监视目录及其子目录,`-e modify`指定只监听文件修改事件。

你可以在你的shell脚本中使用管道`|`和`while read`语句来处理`inotifywait`的输出,然后在每次事件发生时执行你需要的操作。

inotify是利用ebpf机制吗

不是的。`inotify`是Linux内核的一部分,它在eBPF(扩展伯克利包过滤器)出现之前就已经存在了。`inotify`在内核中实现,并使用标准的系统调用接口与用户空间程序进行通信。

eBPF是一个相对较新的技术,它提供了一种在不修改内核源代码的情况下,动态地在内核空间中执行自定义代码的能力。这种功能可以用于许多用途,包括网络过滤、系统调用过滤、性能分析、调试等。

尽管`inotify`和eBPF都是用于实现深度系统检测和监控的强大工具,但是他们的工作方式和用途是不同的。你可以将eBPF看作是一个更底层更通用的监视框架,而`inotify`则是一个具体的,用于文件系统监视的解决方案。

inotify-tools包括哪些工具

`inotify-tools`库包含两个主要的实用程序:`inotifywait`和`inotifywatch`。

1. **`inotifywait`**: 这个工具用于等待文件或目录的事件,然后将事件打印到标准输出。它可以用于编写shell脚本以异步方式响应文件系统事件。它有许多选项,可以用于精细地控制其行为,包括递归监视目录、选择要监听的事件类型或抑制事件输出等。

2. **`inotifywatch`**: 这个工具用于收集关于文件或目录的统计信息,它会记录在一段时间内发生了哪些事件以及每种事件发生了多少次。它的输出是一个报告,包含了每种事件的数量。这个工具可以用于诊断和调试文件系统性能问题,或者更广泛的系统性能问题。

这两个工具都是在标准`inotify`API基础上构建的,他们提供一种更易用的方式来使用`inotify`功能。

inotify的性能怎样

`inotify`是一个高性能的文件系统监控机制。由于它是在Linux内核级别实现的,因此其开销相对较小,速度也快。相比用户空间的文件系统轮询(polling)方法,`inotify`提供了一种实时和高效的解决方案。

当你在目录或文件上注册一个`inotify`监控后,内核会在事件(如文件修改、删除或重命名)发生时立即通知你,而无需周期性轮询文件系统状态。这样可以减少IO操作与CPU使用。

然而要注意的是,虽然`inotify`本身很高效,但如果你监控了大量的文件或目录,可能会消耗大量的内核资源。Linux内核有限制`inotify`可以使用的资源量。例如,每个用户可以创建的`inotify`实例数量、每个实例可以监控的文件数量以及系统级别的总监控数量都有限制。这些限制可以通过系统的`/proc`或`/sys`接口进行查询和修改。

再者,虽然`inotify`提供了文件系统事件的实时通知,但它不能提供关于事件发生原因的上下文信息,比如哪个进程修改了文件。如果需要此类信息,你可能需要用到其他的内核机制,比如`auditd`或eBPF。

auditd是怎样使用的,有什么作用

`auditd`是Linux系统下的审计守护程序,它用于监控和记录系统中发生的安全相关的事件。通过`auditd`,你可以详细地了解系统中发生的任何事情——它可以记录任何由audit规则定义好的系统调用和文件访问事件。

以下是`auditd`的主要功能:

1. 监控文件和目录访问:你可以配置`auditd`来记录哪个用户在什么时候访问(包括读、写、执行等)了哪个文件或目录。

2. 追踪系统调用:你可以设置`auditd`来记录特定的系统调用,包括调用者的详细信息(如UID, GID, PID等)和调用的结果。

3. 用户和管理员行为审计:你可以监控用户的登录、注销、命令历史等,并跟踪系统管理员的所有操作。

4. 侵害检测:通过针对可疑行为设置规则,你可以使用`auditd`作为一个入侵检测系统。

要使用`auditd`,你需要做的第一件事是设置审计规则。规则可以设置为永久的,即使重启系统也会保持,也可以设置为临时的,只在当前会话中有效。

审计规则可以使用`auditctl`命令设置。例如,如果你想监视所有对`/etc/passwd`文件的写入,你可以使用以下命令:

auditctl -w /etc/passwd -p wa -k passwd_changes

这里,`-w`选项指定要监控的文件,`-p`选项指定要监控的权限(在此例中是写入和更改属性),`-k`选项给这条规则设置了一个关键字,稍后可以用来搜索审计日志。

`auditd`的日志记录在`/var/log/audit/audit.log`文件中,你可以使用`ausearch`和`aureport`命令来搜索并生成报告。以上面的规则为例,你可以使用以下命令查找所有与`passwd_changes`关键字匹配的事件:

ausearch -k passwd_changes

注意,运行`auditd`和设置审计规则需要root权限。在使用`auditd`时,你应当谨慎设置审计规则,以避免产生大量的日志导致存储空间不足。

这篇关于inotify学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件