发布于2026-07-14 阅读(0)
扫一扫,手机访问
聊到 Linux 文件系统监控,inotify 绝对是个绕不开的利器。它本身并不直接提供“错误检测”功能,但只要你用对方法,完全能把它变成一套实时告警系统。下面就来拆解几种常见的玩法,看看怎么用它捕捉那些“不对劲”的时刻。

先从最直接的路子说起。
inotify 支持的事件类型里,有一类天然就跟“异常”挂钩。比如你盯着一个文件,它被写完后关闭(IN_CLOSE_WRITE)——这通常是数据写入完成,但也可能是写入过程中间出了问题;再比如目标文件或目录被删除(IN_DELETE_SELF),或者被移动(IN_MOVED_FROM / IN_MOVED_TO),这些动作往往意味着配置被篡改、日志被清空,或者文件被恶意替换。
把这些事件加到监控掩码里,就能第一时间收到通知。来看一个典型的例子:
#include
#include
#include
#include
#define EVENT_SIZE( sizeof (struct inotify_event) )
#define BUF_LEN ( 1024 * ( EVENT_SIZE + 16 ) )
int main() {
int length, i = 0;
int fd;
int wd;
char buffer[BUF_LEN];
fd = inotify_init();
if (fd < 0) {
perror("inotify_init");
return 1;
}
wd = inotify_add_watch(fd, "/path/to/directory",
IN_CLOSE_WRITE | IN_DELETE_SELF | IN_MOVED_FROM | IN_MOVED_TO);
if (wd < 0) {
perror("inotify_add_watch");
close(fd);
return 1;
}
while (1) {
length = read(fd, buffer, BUF_LEN);
if (length < 0) {
perror("read");
break;
}
while (i < length) {
struct inotify_event *event = (struct inotify_event *) &buffer[i];
if (event->len) {
if (event->mask & IN_CLOSE_WRITE) {
printf("File %s closed after being written\n", event->name);
}
if (event->mask & IN_DELETE_SELF) {
printf("File %s deleted\n", event->name);
}
if (event->mask & IN_MOVED_FROM) {
printf("File %s moved from\n", event->name);
}
if (event->mask & IN_MOVED_TO) {
printf("File %s moved to\n", event->name);
}
}
i += EVENT_SIZE + event->len;
}
i = 0;
}
(void) inotify_rm_watch(fd, wd);
(void) close(fd);
return 0;
}
这段代码会循环读取事件,一旦发现匹配的掩码,就打印出文件名和操作类型。实际应用中,你可以把 printf 换成写日志、发警报或者执行修复脚本。
单靠 inotify 本身,能捕获的“错误”其实有限——它只告诉你文件变了,但变好变坏得靠别的工具来判定。这时候就需要打组合拳了。
/var/log/syslog 或 /var/log/messages)本身就是文件,用 inotify 盯着它,一旦有新内容写入,立刻解析最新行,捕捉与文件系统相关的错误信息。这比轮询高效得多。inotify 当成触发器,每当文件被修改后,自动触发 md5sum 或 sha256sum 重新计算哈希值,与基准值比对。如果对不上,说明文件被篡改——这就是一个典型的“错误”场景。IN_DELETE_SELF,立刻拉起备份恢复流程。这种方式把 inotify 从“事件通知器”变成了“错误检测的触发器”,灵活性很高。
如果不想自己写 C 代码,社区里已经有现成的工具可以拿来就用。最典型的就是 inotify-tools 套件,里面包含 inotifywait 和 inotifywatch 两个命令行工具。
while read 循环,就能实现简单的监控脚本。举个例子,用 inotifywait -m /path/to/dir -e modify,delete,close_write 就能实时输出所有修改、删除和写入完成事件。再结合 grep 或 awk 过滤出你关心的模式,一样能实现错误检测。
总的来说,inotify 的核心价值在于“实时”和“精准”。它把文件系统变化的颗粒度降到了单次操作级别,配合其他工具和逻辑,完全可以构建出一套轻量级的错误检测与监控系统。关键不在于它本身有没有错误检测功能,而在于你怎么用它来“编织”出检测能力。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8