温馨提示×

debian readdir怎么监听目录变更

小樊
38
2026-09-10 08:32:14
栏目: 智能运维

在 Debian(以及其它 Linux 系统)上,readdir 本身并不能监听目录变更readdir 只是“读取目录内容”,是一次性或轮询式的。

要“监听目录变更”,常见、推荐的做法如下(按使用场景):


一、推荐方案:inotify(最常用)

1. 使用 inotifywait(最简单)

Debian 自带工具:

sudo apt install inotify-tools

监听目录:

inotifywait -m -r -e create,delete,modify,move /path/to/dir

参数说明:

  • -m:持续监听
  • -r:递归子目录
  • -e:事件类型

2. C 程序使用 inotify(系统调用)

适合写程序:

#include <sys/inotify.h>
#include <stdio.h>
#include <unistd.h>

int main() {
    int fd = inotify_init();
    int wd = inotify_add_watch(fd, "/path/to/dir",
        IN_CREATE | IN_DELETE | IN_MODIFY | IN_MOVED_TO);

    char buf[4096];
    while (1) {
        int len = read(fd, buf, sizeof(buf));
        // 解析 inotify_event
    }
}

优点

  • 实时
  • 内核级,性能好
  • Debian 默认支持

缺点

  • 不支持网络文件系统(NFS)
  • watch 数量有限(可调)

二、老方案:dnotify(已不推荐)

  • 基于 fcntl
  • 粗粒度(整个目录)
  • 已被 inotify 取代

三、文件系统级方案(特殊场景)

fanotify(更底层)

  • 可监听整个文件系统
  • 可用于杀毒、审计
  • 使用复杂

四、轮询方案(不推荐但通用)

如果你不能用了 inotify:

while (1) {
    readdir(...)
    sleep(1);
}

❌ 延迟高、CPU 浪费


五、总结建议

需求 方案
Shell 脚本监听 inotifywait
C/C++ 程序 inotify
系统级监控 fanotify
无法用 inotify 轮询 readdir

如果你愿意,可以告诉我:

  • C / Python / Shell
  • 监听 本地目录还是 NFS
  • 是否需要 递归监听

我可以直接给你一份可运行的示例代码。

0