Inotifywatch neden eklenen dosyalardaki değişiklikleri algılamıyor?


14

/tmpAşağıdakileri kullanarak değişiklikler için klasörümü izlemeye çalışıyorum inotifywatch:

sudo inotifywatch -v -r /tmp

Dosyaların çift (oluşturduktan sonra touch /tmp/test-1 /tmp/test-2) ben son veriyorum inotifywatchtarafından ( Ctrl- Cki gösterileri beni şu istatistikleri:

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/

Çıktı yalnızca istatistikleri yazdırır, ancak beklediğim dosyaları yazdırmaz ( burada veya burada olduğu gibi ). Erişmeye (via farklı türde denedik cat, mktempvs.), ancak aynı şey.

Bir şey mi kaçırdım? Çünkü VPS'deyim ve bir şeyler kısıtlandı mı?

İşletim Sistemi: VPS'de Debian 7.3 (inotify-tools)

Yanıtlar:


14

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 .


1
.bashrcörnekte @ serverfaultkullanıcı yinelemeli kendi evinde dizini izler ama çünkü istatistiklerinde görünmüyor path/.*genişletilir ve bunun sonucunda bir saat altındaki tüm .files için ayarlanır path/(.bashrc dahil) . 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ı).
don_crissti

@don_crissti Hata! OP tarafından verilen iki örneği karıştırdım. Cevabımı düzenledim, teşekkürler!
John WH Smith

Teşekkürler, faydalı oldu. İşte tüm yeni oluşturulan deney * dosyaların içeriğini göstermek için benim için emirdir /tmp: inotifywait -m --format "%f" /tmp | grep --line-buffered ^test | xargs -L1 -I% sudo cat /tmp/% 2> /dev/null.
kenorb

Ayrıca: " Bu, saatler yerleştirildikten sonra oluşturulan bir dosyada meydana gelen herhangi bir olayın algılanmayacağı anlamına gelir. " Herhangi bir olay (dosya oluşturma bile), içerdiği dizin için bir ZATEN ayarlandığı için algılanır ve bu söz konusu dizinin istatistiklerine yansıtılır. inotifywatchOP sorusundaki çıktıya bakın : 2 createolay oradadır (böylece algılanırlar) ancak inotifywatchbir dizini (+ herhangi bir alt dizini) izlediğinden, istatistikler yalnızca o / bu dizinlerle ilgilidir.
don_crissti

1
Burada aynı dalga boyunda olduğumuzu sanmıyorum ... man inotify: When a directory is monitored, inotify will return events for the directory itself, and for files inside the directory.Ayrıca, man inotifywatchhangi olayların izlendiğiyle ilgili net değil: EVENTS>> ... İzlenen bir dosyaya veya izlenen bir dizindeki bir dosyaya erişildi / kapatıldı / açıldı / etc ( "bir dosyada meydana gelen olaylar " anlamına gelir ). Saati ana dizin üzerinde ayarladıktan sonra oluşturulan bir dosya için olaylar algılanır ve inotifywatchistatistiklere yansıtılır (bu olayların hangi dosyalarda meydana geldiğinden bahsetmez).
don_crissti
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.