Ini karena cara Anda menggunakan inotifywatch
, dan cara alat itu sendiri bekerja. Ketika Anda menjalankan inotifywatch -r /tmp
, Anda mulai menonton /tmp
dan 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-1
tidak ada ketika inotifywatch
mulai, tidak ada inotify
arloji 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 inotifywatch
sendirinya. 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 inotifywatch
pada ~/*
(yang diperluas, lihat komentar don_crissti di sini ). Direktori rumah juga ditonton karena ~/.*
mengandung~/.
. Secara teoritis, itu juga harus mengandung ~/..
, yang, dikombinasikan dengan -r
sakelar, akan menghasilkan pengawasan keseluruhan sistem.
Namun, adalah mungkin untuk mendapatkan nama file yang memicu acara buat di direktori yang ditonton, namun saya kira inotifywatch
tidak mengambil informasi ini (disimpan sedikit lebih dalam dari nama direktori). inotify-tools
menyediakan 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, -m
opsi (monitor) akan tetap inotifywait
berjalan setelah acara pertama, yang akan mereproduksi perilaku yang sangat mirip dengan inotifywatch
itu.
.bashrc
dalam contoh @serverfault
tidak muncul dalam statistik karena pengguna memantau direktori home-nya secara rekursif tetapi karenapath/.*
diperluas dan sebagai akibatnya arloji diatur untuk semua berkas .file di bawahpath/
(.bashrc
termasuk). Perintah yang digunakan oleh OP tidak akan pernah menampilkan nama file karena jam tangan ditetapkan untuk/tmp
dan setiap subdirektori karena itu statistik hanya akan berkaitan dengan/tmp
dan subdirektori-nya (yaitu Anda akan melihat file telah diakses / dipindahkan / dll tetapi tidak akan memberi tahu Anda nama).