Dapatkah inotify digunakan untuk menonton file tertentu yang dibuat tanpa memonitor seluruh direktori?

9

Saya ingin diberitahu ketika nama file tertentu dibuat. Saya sedang melihat inotify. The IN_CREATEflag tersedia untuk memantau direktori untuk setiap perubahan di dalamnya, tapi aku lebih suka untuk tidak memantau seluruh direktori karena mungkin ada banyak kegiatan di direktori selain file saya tertarik. Hal ini dapat dilakukan ?

BobDoolittle
sumber
3
Saya kira jawabannya adalah 'tidak'. Setidaknya tidak dengan inotify. Jika Anda dapat mengontrol lokasi file, lebih baik Anda membuat direktori khusus hanya untuk itu, sehingga Anda dapat memantau direktori tanpa terbangun oleh gangguan. Jika Anda tidak dapat mengontrol lokasi, Anda dihadapkan dengan membandingkan bidang 'nama' yang dikembalikan dengan nama (relatif) file Anda, atau memanggil sesuatu seperti accessdengan F_OKuntuk melihat apakah sudah ada.
BobDoolittle

Jawaban:

7

Anda tidak dapat memiliki kernel yang hanya memberi tahu Anda tentang perubahan ke jalur tertentu. Alasannya agak halus:

  • Di Linux, objek file ada secara independen dari nama apa pun yang dimilikinya. Nama-nama file sebenarnya adalah atribut direktori yang mengandungnya, dan satu file dapat dipanggil dengan beberapa nama (lihat, hardlinking).

  • Kernel harus memiliki sesuatu untuk dilampirkan objek inotify; itu tidak bisa melampirkan objek ke pathname karena pathname bukan objek sistem file nyata; Anda harus melampirkan ke direktori induk atau file yang dijelaskan path. Tetapi Anda tidak dapat melampirkan ke file, karena Anda menonton untuk melihat apakah file dengan nama yang diberikan dibuat, bukan perubahan pada file yang diberikan.

Secara teoritis, kernel dapat mengimplementasikan API yang memungkinkan Anda memilih acara untuk pathname yang diberikan saat menambahkan arloji ke direktori, dengan cara yang sama memungkinkan Anda memilih jenis acara. Ini akan mengasapi API, dan kernel pada akhirnya akan memproses data yang sama dan melakukan perbandingan string yang sama dengan yang Anda lakukan di userspace.

Apakah ada kinerja yang nyata untuk menempatkan arloji di direktori yang sangat aktif? Saya tidak yakin seberapa aktif maksud Anda; puluhan file per detik, ratusan, jutaan?

Bagaimanapun, saya akan menghindari access: itu selalu akan berlomba. File dapat dibuat dan dihapus di antara panggilan ke access, dan memanggil accessdalam loop yang sangat ketat akan menjadi lambat, dan jenis masalah inotifyyang dirancang untuk dipecahkan.

Dylan Frese
sumber
Jika saya tidak dapat diberi tahu tentang "perubahan ke jalur tertentu", bagaimana cara kerja inotify sama sekali? Apakah Anda mungkin merujuk ke jalur file secara khusus tetapi bukan jalur direktori?
BobDoolittle
Juga, keuntungan melakukan pemeriksaan di kernel daripada userspace adalah jika ada beberapa proses yang memantau direktori. Alih-alih mengubah konteks mereka semua dalam yang tidak perlu dan meminta mereka semua melakukan perbandingan, Anda bisa beralih dalam proses yang benar-benar peduli tentang jalur file yang dimaksud.
BobDoolittle
Maksud saya ketika memonitor direktori (yang jelas diberikan oleh path), Anda tidak bisa memberitahu kernel untuk memilih hanya peristiwa dengan nama yang diberikan (jadi ya, saya merujuk ke path 'file'). Saya memahami manfaat teoretis dari tidak membangunkan banyak proses, tetapi saya harus kembali bertanya apakah Anda mencoba menggunakan inotify, dan apakah kinerja adalah masalah aktual.
Dylan Frese
1
Atau, jika banyak proses tertarik pada acara tertentu, Anda dapat meminta satu proses mengawasi nama file dan mengirimkan acara 'menarik' melalui sesuatu seperti soket UNIX ke proses yang sebenarnya tertarik pada acara ini (sebagai semacam layanan).
Dylan Frese
Masalah kinerja bisa sangat sulit untuk diukur dan didiagnosis. Daripada berjalan ke dinding bata, saya lebih memilih untuk mengadopsi praktik pemrograman yang baik di tempat pertama, mengembangkan perangkat lunak yang menggunakan pola desain yang baik, dan menghindari situasi seperti itu. Jadi tidak, saya tidak memperhatikan masalah. Saya mengantisipasi masalah potensial, dan menghindari penggunaan inotify dalam kasus ini karena potensi masalah di jalan. Sebagai pengembang perangkat lunak sistem sendiri, saya percaya dalam menyediakan mekanisme yang kuat untuk membantu orang menghindari masalah kinerja, yang merupakan tujuan dari notifikasi.
BobDoolittle