使用INotify监视具有多个符号链接的文件

Spe*_*ump 5 c c++ linux symlink inotify

所以我设置了一些代码来观看编辑的配置文件,直到我使用VIM编辑文件,然后我还必须查看重命名和创建的目录.然后我发现在路径层次结构中没有捕获更高的重命名.然后我看了一下符号链接...... gaaahhhh!

首先设置一个示例,显示一个(很多)棘手的符号链接场景:

mkdir config1
touch config1/config
ln -s config1 machine1

mkdir config2
touch config2/config
ln -s config2 machine2

ln -s machine1 active
Run Code Online (Sandbox Code Playgroud)

现在,给定一个我想要观看的像active/config这样的文件名,我可以看到如何获取inotify监视描述符:

config1/ -> watch active/ follow symlinks (watches inode for config1)
active/ -> watch active/ dont follow symlinks (watches inode for active symlink
active/config -> watch active/config (watches inode for config1/config)
Run Code Online (Sandbox Code Playgroud)

如何在machine1符号链接上添加手表?我是否需要找到一些方法来手动遍历每个符号链接为每个添加手表?怎么样?

目的是允许:

mkdir config3
touch config3/config
ln -s -f -n config3 machine1
Run Code Online (Sandbox Code Playgroud)

并且有inotify警告active/config已被重定向.目前看起来我将不得不添加一个手表:

- target file inode
- every directory inode leading to the file (to detect moves/renames of directories)
- every symlink inode involved in reaching any of the above
Run Code Online (Sandbox Code Playgroud)

必须有一种更简单的方法来观看一个文件?我是偏离了这条道路还是真的这样?

tuc*_*uxi 6

我的回答是直接的“是的,你做得对”。

仔细阅读inotify syscall 手册页后,我看不出有什么方法可以不观察(可能是符号链接的)文件路径的每一步,以便检测对完整路径的任何和所有更改。

这似乎就是工作方式inotify:它只查看特定的文件或文件夹,并且它自己不进行递归。再加上必须明确遵循符号链接,似乎与您的三步计划完全一致。

从联机帮助页中选择的引用:

调用inotify_add_watch(2)时,可以在掩码中指定以下更多位:IN_DONT_FOLLOW(自Linux 2.6.15起)

如果路径名是符号链接,则不要取消引用它。

[...]

限制和注意事项

Inotify 对目录的监视不是递归的:要监视目录下的子目录,必须创建其他监视。对于大型目录树,这可能会花费大量时间。[...]

常见问题解答还为您的策略重新符号链接提供支持:

问:IN_ONLYDIR 和 IN_DONT_FOLLOW 标志怎么样?IN_ONLYDIR 确保事件仅发生在目录上。如果您在文件上创建此类监视,它将不会发出事件。IN_DONT_FOLLOW 禁止跟随符号链接(这些符号链接将被监视,而不是它们指向的文件)。