2015-02-27 4 views
5

Поэтому я настраиваю код для просмотра файла конфигурации для редактирования, который работал до тех пор, пока я не использовал VIM для редактирования файла, тогда мне также нужно было посмотреть каталог для переименований и создания. Затем я обнаружил, что не поймал переименования выше в иерархии путей. Затем я заглянул в символические ссылки ... гааахххх!Используйте INotify для просмотра файла с несколькими символическими ссылками.

Сначала настроить составлен пример, показывающий один (из многих) сложных сценариев символических ссылок:

mkdir config1 
touch config1/config 
ln -s config1 machine1 

mkdir config2 
touch config2/config 
ln -s config2 machine2 

ln -s machine1 active 

Теперь, учитывая имя файла, как активный/конфигурации, что я хочу смотреть, я могу видеть, как получить 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 предупреждают, что активный/конфиг был перенаправлен. На данный момент это выглядит, как я должен добавить часы для:

- 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

Вы не просматриваете страницу "1 файл" - вы смотрите полный путь по файлу. Это, плюс 'inotify', не являющееся рекурсивным, охватывает первые 2 пункта. Существование символических ссылок требует вашей последней точки. – tucuxi

+0

Да, я понимаю, что INotify должен быть настроен для просмотра всех inodes, участвующих в достижении интересующего файла, но я не понимаю, что такое прецедент, который * не требует выполнения того, что я описал? Это сложно (я даже не упомянул «..» и символические ссылки), легко закручивать (подсчет ссылок на многократно встречающиеся каталоги и символические ссылки), имеет множество условий гонки (просмотр символической ссылки, когда кто-то ее меняет?), И все похоже, нуждается в этом. Но нет библиотеки, которая это делает? Да. – Speed8ump

+0

Со всеми его недостатками, inotify все еще намного лучше, чем dnotify он заменяет (см., Например, http://lwn.net/Articles/604686/). Что касается отсутствия библиотек, вы не упомянули, что искали их; libinotiftytools может немного упростить ваши задачи (для вас это syscalls), но я не могу найти ничего, что покрывало бы ваш прецедент. – tucuxi

ответ

3

Мой ответ прямо «да, вы делаете это правильно».

После тщательного изучения inotify syscall manpage, я не вижу возможности отслеживать каждый шаг (возможно, символического) пути к файлу, чтобы обнаружить все и все изменения полного пути.

Это похоже на то, как работает inotify: он просматривает только определенные файлы или папки, и он не выполняет рекурсию самостоятельно. Это, плюс необходимость явно следовать символическим ссылкам, похоже, соответствует вашему трехэтапному плану к письму.

Избранные цитаты из страницы руководства:

следующие дополнительные биты могут быть указаны в маске при вызове inotify_add_watch (2): IN_DONT_FOLLOW (начиная с Linux 2.6.15)

Не разыменовать имя пути если это символическая ссылка.

[...]

Ограничения и предостережения

Inotify мониторинг каталогов не является рекурсивным: для мониторинга подкаталогов каталога, дополнительные часы должны быть созданы. Это может занять значительное время для больших деревьев каталогов. [...]

Это FAQ также оказывает поддержку для вашей стратегии повторных симлинок:

Q: Что о IN_ONLYDIR и IN_DONT_FOLLOW флагах? IN_ONLYDIR гарантирует, что событие происходит только в каталоге. Если вы создадите такие часы в файле, это не приведет к событиям. IN_DONT_FOLLOW запрещает следующие символические ссылки (эти будут проверяться сами, а не файлы, на которые они указывают).

Смежные вопросы