Mengapa jam tangan tidak mendeteksi deteksi perubahan pada file yang ditambahkan?


14

Saya mencoba memonitor /tmpfolder saya untuk perubahan menggunakan inotifywatch:

sudo inotifywatch -v -r /tmp

Setelah membuat beberapa file ( touch /tmp/test-1 /tmp/test-2), saya mengakhiri inotifywatch(dengan Ctrl- Cyang menunjukkan statistik berikut kepada saya:

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/

Output hanya mencetak statistik, tetapi bukan file yang saya harapkan (seperti di sini atau di sini ). Saya mencoba berbagai jenis akses (melalui cat, mktemp, dll), tapi itu hal yang sama.

Apakah saya melewatkan sesuatu? Itu karena saya menggunakan VPS dan ada sesuatu yang dibatasi?

OS: Debian 7.3 (inotify-tools) pada VPS

Jawaban:


14

Ini karena cara Anda menggunakan inotifywatch, dan cara alat itu sendiri bekerja. Ketika Anda menjalankan inotifywatch -r /tmp, Anda mulai menonton /tmpdan semua file yang sudah ada di dalamnya. Ketika Anda membuat file di dalam /tmp, metadata direktori diperbarui untuk memuat nomor inode file baru, yang berarti bahwa perubahan terjadi pada /tmp, bukan /tmp/test-1. Selain itu, karena /tmp/test-1tidak ada ketika inotifywatchmulai, tidak ada inotifyarloji yang ditempatkan di sana. Ini berarti bahwa setiap peristiwa yang terjadi pada file yang dibuat setelah jam tangan ditempatkan tidak akan terdeteksi . Anda mungkin memahaminya lebih baik jika Anda melihatnya sendiri:

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

Jika Anda telah mengaktifkan mekanisme pelacakaninotify_add_watch(2) , perintah terakhir akan memberi Anda jumlah jam tangan yang diatur oleh inotifywatch. Jumlah ini harus sama dengan yang diberikan dengan inotifywatchsendirinya. Sekarang, buat file di dalamnya/tmp dan periksa lagi:

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

Jumlahnya tidak akan bertambah, yang berarti file baru tidak ditonton. Perhatikan bahwa perilaku ini berbeda jika Anda membuat direktori:

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

Ini karena cara -r saklar berperilaku :

-r, --recursive: [...] Jika direktori baru dibuat di dalam direktori yang diawasi mereka akan secara otomatis diawasi.

Edit: Aku punya sedikit bingung antara dua contoh Anda, tetapi dalam kasus pertama , jam tangan yang benar ditempatkan karena panggilan pengguna inotifywatchpada ~/*(yang diperluas, lihat komentar don_crissti di sini ). Direktori rumah juga ditonton karena ~/.*mengandung~/. . Secara teoritis, itu juga harus mengandung ~/.., yang, dikombinasikan dengan -rsakelar, akan menghasilkan pengawasan keseluruhan sistem.

Namun, adalah mungkin untuk mendapatkan nama file yang memicu acara buat di direktori yang ditonton, namun saya kira inotifywatchtidak mengambil informasi ini (disimpan sedikit lebih dalam dari nama direktori). inotify-toolsmenyediakan alat lain, yang disebut inotifywait, yang dapat berperilaku sangat mirip inotify-watch, dan menyediakan lebih banyak opsi keluaran (termasuk %f, yang Anda cari di sini):

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

Dari halaman manual :

--format <fmt>Output dalam format yang ditentukan pengguna, menggunakan sintaks seperti printf. [...] Konversi berikut ini didukung:

%f: ketika suatu peristiwa terjadi dalam suatu direktori, ini akan diganti dengan nama file yang menyebabkan peristiwa itu terjadi .

%e: diganti dengan Acara yang terjadi, pisahkan dengan koma.

Selain itu, -mopsi (monitor) akan tetap inotifywaitberjalan setelah acara pertama, yang akan mereproduksi perilaku yang sangat mirip dengan inotifywatchitu.


1
.bashrcdalam contoh @ serverfaulttidak muncul dalam statistik karena pengguna memantau direktori home-nya secara rekursif tetapi karena path/.*diperluas dan sebagai akibatnya arloji diatur untuk semua berkas .file di bawah path/( .bashrctermasuk). Perintah yang digunakan oleh OP tidak akan pernah menampilkan nama file karena jam tangan ditetapkan untuk /tmpdan setiap subdirektori karena itu statistik hanya akan berkaitan dengan /tmpdan subdirektori-nya (yaitu Anda akan melihat file telah diakses / dipindahkan / dll tetapi tidak akan memberi tahu Anda nama).
don_crissti

@don_crissti Ups, saya mencampuradukkan dua contoh yang diberikan oleh OP. Saya mengedit jawaban saya, terima kasih!
John WH Smith

Terima kasih, ini berguna. Berikut ini adalah perintah saya untuk menampilkan konten dari semua yang baru dibuat file tes * di /tmp: inotifywait -m --format "%f" /tmp | grep --line-buffered ^test | xargs -L1 -I% sudo cat /tmp/% 2> /dev/null.
kenorb

Juga: " Ini berarti bahwa setiap peristiwa yang terjadi pada file yang dibuat setelah jam tangan telah ditempatkan tidak akan terdeteksi. " Setiap peristiwa (bahkan pembuatan file) AKAN terdeteksi karena jam tangan SUDAH diatur untuk direktori yang berisi dan ini adalah tercermin dalam statistik untuk direktori tersebut. Lihat inotifywatchoutput dalam pertanyaan OP: 2 createperistiwa ada di sana (sehingga mereka terdeteksi) tetapi karena inotifywatchmelihat direktori (+ subdirektori apa saja), statistik hanya berkaitan dengan itu / direktori tersebut.
don_crissti

1
Saya tidak berpikir kita berada di gelombang yang sama di sini ... man inotify: When a directory is monitored, inotify will return events for the directory itself, and for files inside the directory.Juga, man inotifywatchjelas tentang peristiwa yang sedang ditonton: EVENTS>> ... File yang diawasi atau file dalam direktori yang diawasi diakses / ditutup / terbuka / dll (berarti termasuk acara "yang terjadi pada file" ). Acara untuk file yang dibuat setelah menyetel arloji pada dir induk AKAN terdeteksi & tercermin dalam inotifywatchstatistik (itu TIDAK akan menyebutkan untuk file mana peristiwa tersebut terjadi).
don_crissti
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.