Tại sao inotifywatch không phát hiện các thay đổi trên các tệp được thêm vào?


14

Tôi đang cố gắng theo dõi /tmpthư mục của mình để thay đổi bằng cách sử dụng inotifywatch:

sudo inotifywatch -v -r /tmp

Sau khi tạo một vài tệp ( touch /tmp/test-1 /tmp/test-2), tôi chấm dứt inotifywatch(bằng Ctrl- Chiển thị cho tôi các thống kê sau:

Establishing watches...
Setting up watch(es) on /tmp
OK, /tmp is now being watched.
Total of 39 watches.
Finished establishing watches, now collecting statistics.
total  attrib  close_write  open  create  filename
8      2       2            2     2       /tmp/

Đầu ra chỉ in các số liệu thống kê, nhưng không in các tệp tôi mong đợi (như ở đây hoặc ở đây ). Tôi cố gắng loại khác nhau của truy cập (thông qua cat, mktemp, vv), nhưng đó là điều tương tự.

Tôi đã bỏ lỡ một cái gì đó? Có phải vì tôi đang dùng VPS và một cái gì đó đã bị hạn chế?

HĐH: Debian 7.3 (công cụ inotify) trên VPS

Câu trả lời:


14

Điều này là do cách bạn đang sử dụng inotifywatchvà cách thức hoạt động của công cụ. Khi bạn chạy inotifywatch -r /tmp, bạn bắt đầu xem /tmpvà tất cả các tệp đã có trong đó. Khi bạn tạo một tệp bên trong /tmp, siêu dữ liệu thư mục được cập nhật để chứa số inode của tệp mới, điều đó có nghĩa là thay đổi xảy ra /tmpchứ không phải /tmp/test-1. Ngoài ra, vì /tmp/test-1không có ở đó khi inotifywatchbắt đầu, không có inotifychiếc đồng hồ nào được đặt trên đó. Điều đó có nghĩa là bất kỳ sự kiện nào xảy ra trên một tệp được tạo sau khi đồng hồ đã được đặt sẽ không được phát hiện . Bạn có thể hiểu nó tốt hơn nếu bạn nhìn thấy nó:

$ inotifywatch -rv /tmp &
Total of n watches.
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n

Nếu bạn đã bật cơ chế theo dõi trêninotify_add_watch(2) , lệnh cuối cùng sẽ cung cấp cho bạn số lượng đồng hồ được thiết lập theo inotifywatch. Con số này phải giống với con số do inotifywatchchính nó đưa ra . Bây giờ, tạo một tập tin bên trong /tmpvà kiểm tra lại:

$ inotifywatch -rv /tmp &
Total of n watches.
$ touch /tmp/test1.txt
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n

Số lượng sẽ không tăng, có nghĩa là tệp mới không được xem. Lưu ý rằng hành vi là khác nhau nếu bạn tạo một thư mục thay thế:

$ inotifywatch -rv /tmp &
Total of n watches.
$ mkdir /tmp/test1
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n + 1

Điều này là do cách -rhành xử của công tắc :

-r, --recursive: [...] Nếu các thư mục mới được tạo trong các thư mục đã xem, chúng sẽ tự động được xem.

Chỉnh sửa: Tôi có một chút nhầm lẫn giữa hai ví dụ của bạn, nhưng trong trường hợp đầu tiên , những chiếc đồng hồ được đặt một cách chính xác bởi vì các cuộc gọi sử dụng inotifywatchtrên ~/*(mà được mở rộng, thấy comment don_crissti ở đây ). Các thư mục nhà cũng được xem bởi vì ~/.*có chứa ~/.. Về mặt lý thuyết, nó cũng nên chứa ~/.., kết hợp với công -rtắc, sẽ dẫn đến việc xem toàn bộ hệ thống.

Tuy nhiên, nó tốt để có được tên của tập tin kích hoạt một tạo sự kiện trong một thư mục theo dõi, nhưng tôi đoán inotifywatchkhông lấy thông tin này (nó được lưu sâu hơn một chút so với tên thư mục). inotify-toolscung cấp một công cụ khác, được gọi inotifywait, có thể hoạt động khá giống inotify-watchvà cung cấp nhiều tùy chọn đầu ra hơn (bao gồm %f, đó là những gì bạn đang tìm kiếm ở đây):

inotifywait -m --format "%e %f" /tmp

Từ trang người đàn ông :

--format <fmt>Xuất ra ở định dạng do người dùng chỉ định, sử dụng cú pháp giống như printf. [...] Các chuyển đổi sau được hỗ trợ:

%f: khi một sự kiện xảy ra trong một thư mục, điều này sẽ được thay thế bằng tên của tệp gây ra sự kiện đó .

%e: được thay thế bằng (các) Sự kiện đã xảy ra, được phân tách bằng dấu phẩy.

Ngoài ra, -mtùy chọn (màn hình) sẽ tiếp tục inotifywaitchạy sau sự kiện đầu tiên, sẽ tái tạo một hành vi khá giống với inotifywatch's.


1
.bashrctrong ví dụ @ serverfaultkhông xuất hiện trong các số liệu thống kê vì người dùng theo dõi đệ quy thư mục chính của nó nhưng vì path/.*được mở rộng và kết quả là đồng hồ được đặt cho tất cả .files bên dưới path/( .bashrcbao gồm). Lệnh được OP sử dụng sẽ không bao giờ xuất tên tệp vì đồng hồ được đặt cho /tmpvà mọi thư mục con do đó thống kê sẽ chỉ liên quan đến /tmpvà các thư mục con của nó (tức là bạn sẽ thấy các tệp đã được truy cập / di chuyển / vv nhưng nó sẽ không cho bạn biết tên).
don_crissti

@don_crissti Rất tiếc, tôi đã trộn lẫn hai ví dụ được đưa ra bởi OP. Tôi chỉnh sửa câu trả lời của tôi, cảm ơn!
John WH Smith

Cảm ơn, nó rất hữu ích. Đây là lệnh của tôi để hiển thị nội dung của tất cả các tệp thử nghiệm * mới được tạo trong /tmp: inotifywait -m --format "%f" /tmp | grep --line-buffered ^test | xargs -L1 -I% sudo cat /tmp/% 2> /dev/null.
kenorb

Ngoài ra: " Điều đó có nghĩa là bất kỳ sự kiện nào xảy ra trên một tệp được tạo sau khi đặt đồng hồ đã được đặt sẽ không được phát hiện. " Bất kỳ sự kiện nào (ngay cả khi tạo tệp) SILL được phát hiện vì đồng hồ được đặt cho thư mục chứa và đây là phản ánh trong số liệu thống kê cho thư mục cụ thể đó. Xem inotifywatchđầu ra trong câu hỏi OP: có 2 createsự kiện ở đó (vì vậy chúng được phát hiện) nhưng vì inotifywatchxem một thư mục (+ bất kỳ thư mục con nào), số liệu thống kê chỉ liên quan đến các thư mục đó.
don_crissti

1
Tôi không nghĩ chúng ta đang ở cùng bước sóng ở đây ... man inotify: When a directory is monitored, inotify will return events for the directory itself, and for files inside the directory.Ngoài ra, man inotifywatchrõ ràng về những sự kiện đang được theo dõi: EVENTS>> ... Một tệp đã xem hoặc một tệp trong thư mục đã xem được truy cập / đóng / mở / vv (có nghĩa là bao gồm các sự kiện "xảy ra trên một tập tin" ). Các sự kiện cho một tệp được tạo sau khi đặt đồng hồ trên thư mục gốc SILL được phát hiện & phản ánh trong các inotifywatchsố liệu thống kê (nó sẽ KHÔNG đề cập đến những tệp nào xảy ra các sự kiện đó).
don_crissti
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.