يعد fsnotify مكتبة إشعار نظام الملفات مكتوبة بلغة Go، والتي يمكن أن تراقب التغييرات في الملفات والدلائل داخل نظام الملفات وتنبه التطبيق عند حدوث تغييرات. وهو يدعم التشغيل عبر الأنظمة المختلفة ويمكنه العمل على أنظمة تشغيل مختلفة مثل Linux و macOS و Windows. يستفيد fsnotify من آليات إشعار نظام الملفات في أنظمة التشغيل المختلفة، مثل inotify في Linux وFSEvents في macOS وReadDirectoryChangesW في Windows.
يتطلب استخدام إصدارات Go 1.17 أو أحدث؛ يمكن العثور على الوثائق الكاملة على https://pkg.go.dev/github.com/fsnotify/fsnotify
دعم أنظمة التشغيل المختلفة:
الخلفية | نظام التشغيل | الحالة |
---|---|---|
inotify | Linux | مدعوم |
kqueue | BSD, macOS | مدعوم |
ReadDirectoryChangesW | Windows | مدعوم |
FEN | illumos | مدعوم |
fanotify | Linux 5.9+ | غير مدعوم حتى الآن |
AHAFS | AIX | فرع AIX؛ ميزة تجريبية بسبب نقص المحافظين وبيئة الاختبار |
FSEvents | macOS | يتطلب دعم x/sys/unix |
USN Journals | Windows | يتطلب دعم x/sys/windows |
Polling | جميع | غير مدعوم حتى الآن |
لم يتم اختبار Android و Solaris، التي يجب أن تشمل Linux و illumos بعد.
حالات الاستخدام
تشمل حالات استخدام fsnotify ولكن لا تقتصر على الحالات التالية:
- مزامنة الملفات في الوقت الفعلي: يمكن لـ fsnotify مراقبة التغييرات في نظام الملفات في الوقت الفعلي، مما يجعله مناسبًا لتنفيذ مزامنة الملفات في الوقت الفعلي. عند حدوث تغييرات في الملف الأصلي، يمكن مزامنة التغييرات على الفور إلى الملف الهدف، مما يضمن تناسق الملفات.
- البناء التلقائي: يمكن لـ fsnotify مراقبة التغييرات في كود المصدر للمشروع وملفات الاعتماد، وتشغيل أوامر البناء عند حدوث التغييرات، مما يحقق البناء التلقائي. يمكن أن يوفر هذا الوقت وجهد البناء اليدوي ويحسن كفاءة التطوير.
- نسخ احتياطي للملفات: يمكن لـ fsnotify مراقبة التغييرات في الملفات أو الدلائل التي تحتاج إلى النسخ الاحتياطي وبدء عملية النسخ الاحتياطي فور حدوث تغييرات. يضمن هذا أمان البيانات ويمنع فقدان البيانات نتيجة فقدان أو تلف الملف.
- مراقبة سجلات الوقت الحقيقي: يمكن لـ fsnotify مراقبة العمليات مثل الإنشاء والتعديل والحذف في ملفات السجل، وتشغيل برامج مراقبة السجلات عند حدوث تغييرات في ملفات السجل، مما يمكن من مراقبة التغييرات في محتوى السجل في الوقت الحقيقي.
- مراقبة أمان نظام الملفات: يمكن لـ fsnotify مراقبة الأحداث الأمنية في نظام الملفات، مثل الوصول إلى الملفات والتعديل والحذف. يتيح هذا مراقبة أمان نظام الملفات، مما يمكن من تحديد وتسجيل الأحداث غير الآمنة بسرعة.
مثال على الاستخدام
مثال أساسي:
package main
import (
"log"
"github.com/fsnotify/fsnotify"
)
func main() {
// إنشاء مراقب جديد.
watcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatal(err)
}
defer watcher.Close()
// بدء الاستماع للأحداث.
go func() {
for {
select {
case event, ok := <-watcher.Events:
if !ok {
return
}
log.Println("الحدث:", event)
if event.Has(fsnotify.Write) {
log.Println("الملف المعدل:", event.Name)
}
case err, ok := <-watcher.Errors:
if !ok {
return
}
log.Println("خطأ:", err)
}
}
}()
// إضافة المسار الذي يحتاج إلى المراقبة.
err = watcher.Add("/tmp")
if err != nil {
log.Fatal(err)
}
// حظر العملية الرئيسية الضجيعة.
<-make(chan struct{})
}
يمكن العثور على مزيد من الأمثلة في cmd/fsnotify ويمكن تشغيلها باستخدام الأمر التالي:
% go run ./cmd/fsnotify
يمكن العثور على توثيق أكثر تفصيلاً في godoc: https://pkg.go.dev/github.com/fsnotify/fsnotify
الأسئلة الشائعة
هل سيتم مراقبتها لاختفائها إذا تم نقل الملف إلى دليل آخر؟
لا، ما لم تكن تراقب الموقع الذي تم نقله إليه.
هل يراقب الدلائل الفرعية؟
لا ، يجب عليك إضافة مراقبة لكل دليل ترغب في مراقبته (المراقبة التكرارية مخطط لها: #18).
هل أحتاج إلى مراقبة القنوات الخطأ والحدث في جملة التحكم في التوازي؟
نعم. يمكنك استخدام "select" لقراءة من كلتا القناتين في نفس جملة التحكم (ليس من الضروري بدء جملة تحكم منفصلة لكل قناة. انظر إلى المثال).
لماذا لا تعمل الإشعارات على NFS، SMB، FUSE، /proc، أو /sys؟
يتطلب fsnotify دعمًا من نظام التشغيل الأساسي للعمل. بروتوكولات NFS و SMB الحالية لا توفر الدعم على مستوى الشبكة لإشعارات الملفات، وكذلك أنظمة الملفات الظاهرية /proc و /sys لا توفر الدعم أيضًا.
يمكن حل هذا الأمر عن طريق استخدام جهاز رصد استطلاعي (#9)، لكن لم يتم تنفيذه بعد.
لماذا أتلقى العديد من أحداث Chmod؟
قد تقوم بعض البرامج بإنشاء عدد كبير من التغييرات في السمات، مثل Spotlight على macOS، وبرامج مكافحة الفيروسات، وتطبيقات النسخ الاحتياطي، وبعض التطبيقات المعروفة الأخرى. بشكل عام، تجاهل أحداث Chmod يكون عادةً أفضل لأنها غالبًا ما تكون غير مفيدة وقد تسبب مشاكل.
فإن فهرسة Spotlight على macOS قد تسبب حدوث أحداث متعددة (انظر إلى #15). الحل المؤقت هو إضافة مجلداتك إلى إعدادات الخصوصية في Spotlight حتى نحصل على تنفيذ FSEvents الأصلي (انظر إلى #11).
مراقبة الملفات لا تعمل جيدًا
غالبًا ما لا يُوصى عمومًا بمراقبة الملفات الفردية (بدلاً من الدلائل) لأن العديد من البرامج، خاصة برامج التحرير، ستقوم بتحديث الملفات بشكل ذريع: ستقوم بكتابة ملف مؤقت ثم نقله إلى الموقع المستهدف، محلية الملف الأصلي (أو نسخة منه). فإن المراقبة على الملف الأصلي فقد فقدت الآن بسبب عدم وجود الملف.
ونتيجة لذلك، قد لا تؤدي فشل الكهرباء أو الانهيار إلى نتجية ملف مكتوب جزئيًا.
قم بمراقبة الدليل الأصلي واستخدام Event.Name
لتصفية الملفات التي ليست لديك اهتمام بها. هناك مثال في cmd/fsnotify/file.go
.
ملاحظات لأنظمة محددة
Linux
عندما يتم حذف ملف، لن يتم إصدار حدث "REMOVE" حتى يتم إغلاق جميع وصفات الملف المفتوحة؛ في هذا الوقت، سيتم إصدار حدث "CHMOD":
fp := os.Open("file")
os.Remove("file") // CHMOD
fp.Close() // REMOVE
هذا هو الحدث الذي تم إرساله بواسطة inotify، لذا لا ينبغي إجراء تغييرات كبيرة فيه.
المتغير sysctl fs.inotify.max_user_watches
يحدد العدد الأقصى للمراقبات لكل مستخدم، وfs.inotify.max_user_instances
يحدد العدد الأقصى لحالات inotify لكل مستخدم. كل Watcher تقوم بإنشائه هو "حالة"، وكل مسار تقوم بإضافته هو "رصد".
يمكن العثور على هذه في /proc
، مع المسارات /proc/sys/fs/inotify/max_user_watches
و/proc/sys/fs/inotify/max_user_instances
.
لزيادتهما، يمكنك استخدام sysctl
أو كتابة القيم إلى ملف proc:
sysctl fs.inotify.max_user_watches=124983
sysctl fs.inotify.max_user_instances=128
لجعل التغييرات تأتي بعد إعادة التشغيل، قم بتحرير /etc/sysctl.conf
أو /usr/lib/sysctl.d/50-default.conf
(ربما تختلف التفاصيل بالنسبة لكل توزيع Linux، يرجى الرجوع إلى وثائق التوزيع الخاص بك):
fs.inotify.max_user_watches=124983
fs.inotify.max_user_instances=128
الوصول إلى الحد سيؤدي إلى ظهور أخطاء "لا يوجد مساحة متبقية على الجهاز" أو "عدد كبير جدًا من الملفات المفتوحة".
kqueue (macOS، جميع أنظمة BSD)
kqueue يتطلب فتح وصف ملف لكل ملف مُراقب؛ لذا، إذا كنت تراقب دليلًا يحتوي على خمسة ملفات، فهذا ستكون ستة وصفات لملفات. في هذه الأنظمة، ستصل بسرعة إلى الحد الأقصى لـ "الملفات المفتوحة القصوى" للنظام.
يمكنك استخدام متغيرات sysctl kern.maxfiles
و kern.maxfilesperproc
للتحكم في الحد الأقصى للملفات المفتوحة.