Bunun nedeni, kullanım şekliniz inotifywatchve aracın kendisinin çalışma biçimidir. Eğer çalıştırdığınızda inotifywatch -r /tmp, izlemeye başladıktan /tmpolan tüm dosya ve zaten onun içinde. Bir dosya içini oluşturduğunuzda /tmp, dizin meta veri değişimi olur demek olduğunu yeni dosyanın düğüm numarasını içerecek şekilde güncellenir /tmpdeğil /tmp/test-1. Çünkü Ayrıca, /tmp/test-1ne zaman orada değildi inotifywatchbaşladı hiçbir yoktur inotifybunun üzerine yerleştirilen izle. Bu, saatler yerleştirildikten sonra oluşturulan bir dosyada meydana gelen olayların algılanmayacağı anlamına gelir . Kendiniz görürseniz daha iyi anlayabilirsiniz:
$ inotifywatch -rv /tmp &
Total of n watches.
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
Eğer varsa ilgili izleme mekanizması etkininotify_add_watch(2) , son komutu size kurduğu saatlerin sayısını verecektir inotifywatch. Bu sayı, inotifywatchkendi başına verilenle aynı olmalıdır . Şimdi içinde bir dosya oluşturun /tmpve tekrar kontrol edin:
$ inotifywatch -rv /tmp &
Total of n watches.
$ touch /tmp/test1.txt
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
Sayı artmayacak, yani yeni dosya izlenmiyor. Bunun yerine bir dizin oluşturursanız davranışın farklı olduğunu unutmayın:
$ inotifywatch -rv /tmp &
Total of n watches.
$ mkdir /tmp/test1
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n + 1
Bu, -ranahtarın davranış biçiminden kaynaklanmaktadır :
-r, --recursive: [...] İzlenen dizinlerde yeni dizinler oluşturulursa, bunlar otomatik olarak izlenir.
Düzenleme: Ben senin iki örnek arasındaki karıştı biraz heyecanlandım, ama birinci durumda kullanıcı aramaları nedeniyle, saatler doğru yerleştirilir inotifywatchüzerinde ~/*(genişletilir, burada don_crissti yorumuna bakınız ). Home dizini de ~/.*içerdiği için izlenir ~/.. Teorik olarak, aynı zamanda içermelidir ~/..ile kombine olan, -ranahtar, tüm sistemi izlerken neden.
Ancak, olan bir tetikleme dosyanın adını almak mümkün oluşturmak izlenen dizinde olayı henüz tahmin ediyorum inotifywatch(o dizin adı daha derine bir az şey kaydedilir) bu bilgileri almak değil. inotify-toolsadında başka bir araç sağlar inotifywait, bu da hemen hemen aynı şekilde davranabilir inotify-watchve daha fazla çıktı seçeneği sağlar ( %faradığınız şey budur):
inotifywait -m --format "%e %f" /tmp
Gönderen adam sayfası :
--format <fmt>Printf benzeri sözdizimi kullanarak kullanıcı tanımlı bir biçimde çıktı alın. [...] Aşağıdaki dönüşümler desteklenmektedir:
%f: bir dizin içinde bir olay meydana geldiğinde, bu olay olayın gerçekleşmesine neden olan dosyanın adıyla değiştirilir .
%e: virgülle ayrılmış gerçekleşen Olaylarla değiştirildi.
Ayrıca, -mseçenek (monitör) inotifywaitilk olaydan sonra çalışmaya devam edecek ve bu da inotifywatch' s'a oldukça benzer bir davranış üretecektir .
.bashrcörnekte @serverfaultkullanıcı yinelemeli kendi evinde dizini izler ama çünkü istatistiklerinde görünmüyorpath/.*genişletilir ve bunun sonucunda bir saat altındaki tüm .files için ayarlanırpath/(.bashrcdahil) . Saatler tarafından ayarlandığından/tmpve alt dizinlerden dolayı OP tarafından kullanılan komut hiçbir zaman dosya adları vermeyecektir, bu nedenle istatistikler yalnızca/tmpve alt dizinleri ile ilgilidir (yani dosyalara erişildiğini / taşındığını / vb. Göreceksiniz, ancak bunların adları).