سؤال

هل هناك طريقة لإجبار عملية Samba على إغلاق ملف معين دون قتله؟

يفتح Samba عملية لكل اتصال عميل، وأحيانًا أرى أنه يحتفظ بالملفات المفتوحة لفترة أطول بكثير من اللازم.عادةً ما أقوم بإنهاء العملية، وسيقوم العميل (windows) بإعادة فتحها في المرة التالية التي يصل فيها إلى المشاركة؛ولكن في بعض الأحيان يقرأ ملفًا آخر بنشاط لفترة طويلة، وأرغب في "إنهاء" ملف واحد فقط، وليس الاتصال بالكامل.

يحرر:لقد حاولت "إغلاق ملف net rpc" ولكن يبدو أنه لا يعمل.هل يعرف أحد لماذا؟

يحرر: هذا هو أفضل ذكر وجدته لشيء مماثل.يبدو أن هناك مشكلة في عميل Win32، وهو أمر يوجد لدى خوادم Microsoft حل بديل له؛لكن سامبا لا يفعل ذلك.أتمنى net rpc file close <fileid> نجح الأمر، سأستمر في محاولة معرفة السبب.أنا أقبل إجابة LuckyLindy، حتى لو لم تحل المشكلة، لأنها الإجراء المفيد الوحيد في هذه الحالة.

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

المحلول

يحدث هذا دائمًا على أنظمتنا، خاصة عند الاتصال بـ Samba من جهاز يعمل بنظام Win98.نتبع الخطوات التالية لحلها (والتي ربما تكون مشابهة لخطواتك):

  • تعرف على جهاز الكمبيوتر الذي يستخدم الملف (على سبيل المثال. lsof|grep -i <file_name>)
  • حاول فتح هذا الملف من الكمبيوتر المخالف، أو معرفة ما إذا كانت هناك عملية مختبئة في مدير المهام ويمكننا إغلاقها
  • إذا لم يحالفك الحظ، اطلب من المستخدم الخروج من أي برامج شبكة مهمة
  • اقتل عملية Samba الخاصة بالمستخدم من Linux (أي. kill -9 <pid>)

أتمنى لو كان هناك طريقة أفضل!

نصائح أخرى

أقوم بإنشاء إجابة جديدة، نظرًا لأن إجابتي الأولى تحتوي في الواقع على المزيد من الأسئلة، ولم تكن في الواقع الكثير من المساعدة.

بعد إجراء القليل من البحث، لم أتمكن من العثور على أي أخطاء مفتوحة حاليًا لأحدث إصدار من Samba، يرجى التحقق من ذلك تقرير أخطاء سامبا موقع الويب، وإنشاء خطأ جديد.هذه هي أبسط طريقة لجعل شخص ما يقترح أفكارًا حول كيفية إصلاح المشكلة، وجعل المطورين ينظرون إلى المشكلة.تركت LuckyLindy تعليقًا في إجابتي السابقة يقول فيه أن هذا هو الحال منذ 5 سنوات حتى الآن، حسنًا، المشروع مفتوح المصدر وأفضل طريقة لإصلاح شيء خاطئ عن طريق الإبلاغ عنه أو توفير التصحيحات.

لقد عثرت أيضًا على إدخال واحد في القائمة البريدية: سامبا فتح الملفات, ، يقترحون إضافة posix locking=no إلى ملف التكوين، طالما لم يكن لديك أيضًا الملفات التي تم تسليمها عبر NFS، فلا ينبغي أن يكون قفل الملف على ما يرام، أي إذا كان الملف المحتجز مقفلاً.

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

الحل الذي ذكرته بالفعل هو إعادة تشغيل السامبا بشكل دوري كحل بديل.أعلم أنه ليس حلاً ولكنه قد ينجح مؤقتًا.

ربما يتم الرد على هذا هنا: كيفية إغلاق واصف الملف من عملية أخرى في أنظمة يونكس

على التخمين، ربما لا يعمل "إغلاق ملف net rpc" لأن الاتصال بين العمليات الذي يطلب من Samba إغلاق الملف ينتهي به الأمر بعدم النظر إليه حتى تتم قراءة الملف الذي تريد إغلاقه.

إذا لم يكن هناك خيار صريح في السامبا، فسيكون من المستحيل إغلاق واصف ملف مفتوح خارجيًا بواجهات يونكس القياسية.

بشكل عام، لا يمكنك التدخل في واصفات ملفات العملية من الخارج.ومع ذلك، كجذر، يمكنك بالطبع القيام بذلك كما رأيت في مقالة phrak هذه من عام 1997: http://www.phrack.org/issues.html?issue=51&id=5#article - لا أنصح بفعل ذلك على نظام الإنتاج بالرغم من ذلك...

السؤال الأفضل في هذه الحالة هو لماذا؟لماذا تريد إغلاق الملف مبكرًا؟ما هو الغرض في النهاية من إغلاق الملف؟ما الذي تحاول تحقيقه؟

يوفر Samba أوامر لعرض الملفات المفتوحة وإغلاقها.

لسرد جميع الملفات المفتوحة:

صافي ملف RPC -U أدمين%كلمة المرور

يستبدل أدمين و كلمة المرور باستخدام بيانات اعتماد مسؤول مجال Windows AD.يمنحك هذا معرف الملف واسم المستخدم لمن قام بفتحه وحالة القفل واسم الملف.ستحتاج في كثير من الأحيان إلى تصفية النتائج عن طريق تمريرها عبر grep.

بمجرد العثور على الملف الذي تريد إغلاقه، انسخ رقم معرف الملف الخاص به واستخدم هذا الأمر:

إغلاق ملف net rpc معرف الملف -U أدمين%كلمة المرور

كنت بحاجة لإنجاز شيء كهذا، حتى أتمكن بسهولة من إلغاء تحميل الأجهزة التي كنت أشاركها.لقد كتبت هذا البرنامج النصي السريع bash:

#!/bin/bash
PIDS_TO_CLOSE=$(smbstatus -L | tail -n-3 | grep "$1" | cut -d' ' -f1 - | sort -u | sed '/^$/$
for PID in $PIDS_TO_CLOSE; do
    kill $PID
done

يستغرق وسيطة واحدة، والمسارات لإغلاق:

smbclose /media/drive

يتم إغلاق أي مسار يطابق تلك الوسيطة (بواسطة grep)، لذا يجب أن تكون محددًا جدًا معه.(تتأثر فقط الملفات المفتوحة من خلال samba.) من الواضح أنك تحتاج إلى الجذر لإغلاق الملفات المفتوحة بواسطة مستخدمين آخرين، ولكنه يعمل بشكل جيد مع الملفات المفتوحة لديك.لاحظ أنه كما هو الحال مع أي إغلاق إجباري آخر للملف، يمكن أن يحدث تلف في البيانات.طالما أن الملفات غير نشطة، يجب أن يكون الأمر على ما يرام.

إنه أمر قبيح جدًا، ولكن بالنسبة لحالة الاستخدام الخاصة بي (إغلاق نقاط التثبيت بالكامل) فإنه يعمل بشكل جيد بما فيه الكفاية.

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