سؤال

أنا أكتب مراقب inotify في C لخادم Minecraft.في الأساس، يقوم بمراقبة server.log، والحصول على أحدث سطر، وتحليله، وإذا كان يطابق التعبير العادي؛يقوم ببعض الإجراءات.

يعمل البرنامج بشكل طبيعي من خلال "سلسلة الصدى المطابقة لـ regex >> server.log"، ويقوم بالتحليل ويفعل ما ينبغي عليه.ومع ذلك، عندما تتم كتابة السلسلة إلى الملف تلقائيًا عبر خادم Minecraft، فإنها لا تعمل حتى أقوم بإيقاف تشغيل الخادم أو (أحيانًا) تسجيل الخروج.

أود أن أنشر الكود، ولكني أتساءل عما إذا كان لا علاقة له بتدفق بيانات ext4 إلى القرص أو شيء من هذا القبيل؛مشكلة في نظام الملفات.سيكون الأمر غريبًا إذا كان الأمر كذلك، لأن "tail -f server.log" يتم تحديثه كلما حدث ذلك.

هل كانت مفيدة؟

المحلول

حللت مشكلتي.اتضح أن الخادم كان يكتب إلى ملف السجل أسرع من قدرة المراقب على القراءة منه ؛لذلك توقف المراقب عن المزامنة.

لقد أصلحته عن طريق إضافة فحص بعد معالجة الحدث قائلاً "إذا كان عدد الأسطر الموجودة حاليًا في ملف السجل أكبر من الطول المسجل للسجل ، فأعد معالجة الملف حتى يتساوى الاثنان."

شكرًا لمساعدتك!

نصائح أخرى

من المفترض أن هذا لأنك تراقب IN_CLOSE الأحداث، والتي قد لا تحدث حتى يتم إيقاف تشغيل الخادم (وإغلاق مؤشر ملف السجل).يرى رجل inotify(7) لمعلمات القناع الصالحة لـ inotify_add_watch() يتصل.أتوقع أنك سوف ترغب في استخدامها IN_WRITE.

من المرجح أن تكون نظريتك صحيحة، حيث يتم تخزين ملف السجل مؤقتًا بواسطة نظام التشغيل، ولا يقوم كاتب السجل بمسح هذا المخزن المؤقت، لذلك سيبقى كل شيء في المخزن المؤقت حتى يتم إغلاق الملف أو امتلاء المخزن المؤقت.إحدى الطرق السريعة للاختبار هي بدء تشغيل السجل إلى النقطة التي تعلم أنه سيكتب فيها الأحداث في السجل، ثم إغلاقه بالقوة حتى لا يتمكن من إغلاق المقبض، إذا كان السجل فارغًا فهو بالتأكيد المخزن المؤقت.إذا كان بإمكانك الحصول على مقبض/واصف الملف، فيمكنك استخدامه setbuf لإزالة التخزين المؤقت، على حساب الأداء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top