2015-02-27 17 views
5

Vì vậy, tôi thiết lập một số mã để xem tệp cấu hình cho các chỉnh sửa, hoạt động cho đến khi tôi sử dụng VIM để chỉnh sửa tệp, sau đó tôi cũng phải xem thư mục để đổi tên và tạo. Sau đó, tôi phát hiện ra rằng không bắt được đổi tên cao hơn trong hệ thống phân cấp đường dẫn. Sau đó, tôi nhìn vào symlinks ... gaaahhhh!Sử dụng INotify để xem tệp có nhiều liên kết tượng trưng

thiết lập đầu tiên một tạo thành ví dụ cho thấy một (nhiều) kịch bản liên kết tượng trưng phức tạp:

mkdir config1 
touch config1/config 
ln -s config1 machine1 

mkdir config2 
touch config2/config 
ln -s config2 machine2 

ln -s machine1 active 

Bây giờ, cho một tên tập tin như hoạt động/config mà tôi muốn xem, tôi có thể xem làm thế nào để có được một inotify xem bộ mô tả cho:

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) 

Làm cách nào để thêm đồng hồ trên liên kết tượng trưng machine1? Tôi có cần phải tìm cách nào đó để tự đi từng liên kết tượng trưng để thêm đồng hồ cho mỗi đường đi không? Làm sao?

Mục đích là để cho phép:

mkdir config3 
touch config3/config 
ln -s -f -n config3 machine1 

Và có inotify cảnh báo rằng hoạt động/config đã được chuyển hướng. Tại thời điểm này, có vẻ như tôi sẽ phải thêm đồng hồ cho:

- 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 

Phải có cách dễ dàng hơn để chỉ xem một tệp? Tôi đã lạc lối khỏi con đường hay đây thực sự là con đường?

+0

Bạn không xem "một tệp" - bạn đang xem toàn bộ đường dẫn, tệp được bao gồm. Điều đó, cộng với 'inotify' không được đệ quy, bao gồm 2 điểm đầu tiên. Sự tồn tại của các liên kết tượng trưng bắt buộc điểm cuối cùng của bạn. – tucuxi

+0

Có, tôi hiểu rằng INotify phải được thiết lập để xem tất cả các inode liên quan đến việc truy cập tệp quan tâm, nhưng tôi không rõ trường hợp sử dụng là gì * không * yêu cầu thực hiện những gì tôi đã mô tả? Nó phức tạp (thậm chí tôi không đề cập đến '..' và symlink), dễ dàng xoay xở (tham chiếu đếm nhiều thư mục và liên kết tượng trưng), có nhiều điều kiện chủng tộc (xem một liên kết trong khi ai đó đang thay đổi nó?), Và mọi người dường như cần nó. Nhưng không có thư viện nào làm điều đó? Huh. – Speed8ump

+0

Với tất cả những thiếu sót của nó, inotify vẫn còn tốt hơn rất nhiều so với dnotify nó thay thế (xem, ví dụ, http://lwn.net/Articles/604686/). Đối với thiếu thư viện, bạn không đề cập đến bạn đang tìm kiếm chúng; libinotiftytools có thể đơn giản hóa công việc của bạn (nó làm syscalls cho bạn), nhưng tôi không thể tìm thấy bất cứ điều gì mà bao gồm trường hợp sử dụng chính xác của bạn. – tucuxi

Trả lời

3

Câu trả lời của tôi là thẳng "vâng, bạn đang làm đúng".

Sau khi đọc cẩn thận inotify syscall manpage, tôi không thể thấy bất kỳ cách nào để xem từng bước của tệp có thể có để phát hiện bất kỳ và tất cả thay đổi đối với đường dẫn đầy đủ.

Điều này dường như chỉ là cách inotify hoạt động: nó chỉ xem xét các tệp hoặc thư mục cụ thể và không tự mình đệ quy. Điều đó, cộng với việc phải theo dõi một cách rõ ràng các liên kết tượng trưng, ​​dường như phù hợp với kế hoạch 3 bước của bạn với chữ cái đó.

dấu ngoặc kép được chọn từ manpage:

Các bit thêm sau đây có thể được quy định trong mặt nạ khi gọi inotify_add_watch (2): IN_DONT_FOLLOW (vì Linux 2.6.15)

Đừng dereference tên đường dẫn nếu nó là một liên kết tượng trưng.

[...]

Hạn chế và hãy cẩn thận

inotify giám sát các thư mục không phải là đệ quy: theo dõi các thư mục con dưới một thư mục, đồng hồ bổ sung phải được tạo ra. Điều này có thể mất một số lượng đáng kể thời gian cho cây thư mục lớn. [...]

này FAQ cũng cho vay hỗ trợ cho chiến lược của bạn lại liên kết tượng trưng:

Q: Thế còn IN_ONLYDIR và cờ IN_DONT_FOLLOW? IN_ONLYDIR đảm bảo rằng sự kiện chỉ xảy ra trên một thư mục. Nếu bạn tạo đồng hồ trên một tệp, nó sẽ không phát ra các sự kiện. IN_DONT_FOLLOW cấm các liên kết tượng trưng (những cái này sẽ được theo dõi chính mình chứ không phải các tệp mà chúng trỏ tới).

Các vấn đề liên quan