所以我设置了一些代码来观看编辑的配置文件,直到我使用VIM编辑文件,然后我还必须查看目录以进行重命名和创建。然后我发现在路径层次结构中没有捕获更高的重命名。然后我查看了符号链接...... gaaahhhh!
首先设置一个示例,显示一个(很多)棘手的符号链接场景:
mkdir config1
touch config1/config
ln -s config1 machine1
mkdir config2
touch config2/config
ln -s config2 machine2
ln -s machine1 active
现在,给定一个我想要观看的像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)
如何在machine1符号链接上添加手表?我是否需要找到一些方法来手动遍历每个符号链接为每个添加手表?怎么样?
目的是允许:
mkdir config3
touch config3/config
ln -s -f -n config3 machine1
并且有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
必须有一种更简单的方法来观看一个文件?我是偏离了这条道路还是真的这样?
答案 0 :(得分:3)
我的回答是直接的,是的,你做得对,"。
在仔细阅读inotify syscall manpage之后,我看不出任何方法没有看到(可能是符号链接的)路径到文件的每一步,以便检测到完整路径的任何和所有更改
这似乎是inotify
的工作方式:它只查看特定的文件或文件夹,并且它不会自行进行递归。这一点,加上必须明确遵循符号链接,似乎与你的三步计划相符。
联机帮助页中的选定引号:
调用inotify_add_watch(2)时,可以在掩码中指定以下其他位: IN_DONT_FOLLOW(自Linux 2.6.15起)
如果是符号链接,请不要取消引用路径名。
[...]
限制和警告
目录的Inotify监控不是递归的:要监视目录下的子目录,必须创建其他监视。对于大型目录树,这可能需要相当长的时间。 [...]
此FAQ还支持您的策略重新符号链接:
问:IN_ONLYDIR和IN_DONT_FOLLOW标志怎么样? IN_ONLYDIR确保事件仅在目录上发生。如果在文件上创建此类监视,则不会发出事件。 IN_DONT_FOLLOW禁止跟随符号链接(这些链接将被自己监视,而不是它们指向的文件)。