كيفية تسلسل البرامج النصية init.d تحت أوبونتو

StackOverflow https://stackoverflow.com/questions/1852676

  •  13-09-2019
  •  | 
  •  

سؤال

لدي بعض الخوادم وغيرها من الشياطين أحتاج للبدء في التسلسل الصحيح.

لقد قمت بإنشاء البرامج النصية Init.d من البرنامج النصي الهيكل العظمي، ويمكنك تثبيتها للبدء في تسلسل مناسب باستخدام نظام التسمية المرقمة، ولكن لا تزال هناك عدد قليل من المشكلات:

يحتاج خادم واحد ("Servera") إلى تهيئة اتصال قاعدة البيانات، ثم استمع إلى مأخذ توصيل. يحتاج خادم آخر ("ServerB") إلى الاتصال بهذا المقبس، وسيفشل الاتصال إذا كانت العملية السابقة ليست حتى الآن. هل هناك طريقة لمنع البرنامج النصي Init.d for ServerA من إنهاء حتى بدأت Servera الاستماع؟ لن يبدأ ServerB INIT حتى تم إنهاء Servera Init.

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

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

المحلول

نعم، هذا هو سؤالي أن أجيب، لكنني وجدت هذه التقنية لتكون مفيدة، وتقاسم أي شخص آخر يكافح مع المشاكل المماثلة.

لقد وجدت SOCAT مفيدة للغاية في انتظار مأخذ أو منفذ. البرنامج النصي init.d مثل:

case “$1″ in
  start)
  echo '--benign phrase' | socat - UNIX-CONNECT:/path/to/socket,retry=10,intervall=1
;;

سوف ننتظر حتى يصبح المقبس قابل للكتابة، ثم العودة. لا يوجد مخلوه المعربين، لذلك تمنع تنفيذ البرامج النصية المرقمة في INT.D المرتفع حتى تنتهي.

ستباطأ استخدام البرامج النصية للنادل هذه تسلسل التمهيد، وبالتالي فهي غير مثالية، ولكنها تحسنة كبيرة من النهج الهش للغاية من بيانات "النوم N" الرش في البرامج النصية.

نصائح أخرى

لا أعتقد أنه هش - على الأقل أستطيع أن أفكر في السيناريو حيث لن يكون هشا. لديك وقت إعادة المحاولة لمدة 5 ثوان وليس سيئا على الإطلاق. إنه نهج قبلة وليس هناك أي حالات ركنية لا تفهمها.

الحصول على بيئة موزعة متزامنة ليست للاشمئزاز القلبية، وزيادة مبالغة في مثالك.

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

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

for i in 1 2 3 4 5; do
  if [ -e '/var/run/myserver.sock' ]; then
    break
  fi
done

حل آخر هو أن يكون لديك الخادم الخاص بك وليس مخلل حتى فتح مقبس الاستماع. وبهذه الطريقة، سيقابل البرنامج النصي INIT حتى العملية الموضحة، والتي تضمن المقبس متاح.

بالطبع، هذا يعتمد على طلبك في القيام بيئة الرأس نفسه، وليس من خلال بعض الوسائل الأخرى. ("/ usr / bin / myserver &" أو مثل ")

محدث:

لاحظ أيضا أنه، ما الذي تقوم به الآن هو كل نظام نظام System-V. يستخدم Ubuntu فعلا upstart، وهو نظام يستند إلى الأحداث بدلا من سلسلة من البرامج النصية. يمكنك اختيار استخدام وظائف UPSTART بدلا من البرامج النصية System-V Init، وإطلاق حدث Upstart مخصص من الخادم الخاص بك، والذي سيؤدي إلى إطلاق خادم خادمك الثاني.

ال دليل البداية لديه مثال على ذلك في أسفل جدا. لا أعرف إذا كان هناك طريقة API، ولكن يمكن أن تكون مجرد مسألة "نظام (" / bin / initctl تنبعث مييفنت ")؛ في النقطة الصحيحة في الوقت المناسب في الخادم الأول. قد يكون شخص آخر مع تجربة أكثر صعوبة قادرا على توضيح أفضل / أبعد من ذلك.

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