Điều này là do cách bạn đang sử dụng inotifywatch
và 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 /tmp
và 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 /tmp
chứ không phải /tmp/test-1
. Ngoài ra, vì /tmp/test-1
không có ở đó khi inotifywatch
bắt đầu, không có inotify
chiế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 inotifywatch
chính nó đưa ra . Bây giờ, tạo một tập tin bên trong /tmp
và 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 -r
hà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 inotifywatch
trê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 -r
tắc, sẽ dẫn đến việc xem toàn bộ hệ thống.
Tuy nhiên, nó là 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 inotifywatch
khô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-tools
cung cấp một công cụ khác, được gọi inotifywait
, có thể hoạt động khá giống inotify-watch
và 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, -m
tùy chọn (màn hình) sẽ tiếp tục inotifywait
chạ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.
.bashrc
trong ví dụ @serverfault
khô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ướipath/
(.bashrc
bao 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/tmp
và mọi thư mục con do đó thống kê sẽ chỉ liên quan đến/tmp
và 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).