كيفية تثبيت وإدارة Supervisor على خواديم أوبنتو ودبيان


عبد اللطيف ايمش

يشيع في بيئات الخواديم الوهمية (VPS) تواجد عدد من البرامج الصغيرة التي تريدها أن تعمل عملًا متواصلًا، سواءً كانت سكربتات صدفة (shell scripts) صغيرة، أو تطبيقات Node.js، أو أيّة تطبيقات كبيرة أخرى. 

ستكتب عادةً سكربت init لكل برنامج من تلك البرامج، لكن سرعان ما ستستهلك هذه الطريقة وقتًا لإدارتها، ولن يسهل للمستخدمين الجدد استعمالها. 
Supervisor هو مدير للعمليات الذي يجعل إدارة عدد من البرامج التي تعمل عملًا متواصلًا أمرًا هينًا بتوفير واجهة موحدة يمكنك خلالها مراقبة تلك البرامج والتحكم بها. 

سنفترض في درسنا هذا أنَّك معتادٌ على استعمال سطر الأوامر وتثبيت الحزم وإجراء بعض أمور الإدارة البسيطة على الخادوم.

ubuntu-debian-process-control-supervisor.png

التثبيت

تثبيت Supervisor على توزيعتَي أوبنتو ودبيان سهلٌ للغاية، إذ تتوفر حزمٌ مبنيةٌ مسبقًا في مستودع كلا التوزيعتين. 

نفِّذ الأمر الآتي بحساب الجذر لتثبيت حزمة Supervisor:

apt-get install supervisor

سيُشغّل "عفريت" (daemon) خدمة supervisor مباشرةً بعد إكمال التثبيت، لأنَّ الحزم التي ثبتها تحتوي على سكربت init الذي سيُشغِّل Supervisor بعد إعادة تشغيل النظام. يمكنك التأكد من ذلك بتنفيذ الأمر:

service supervisor restart

يمكننا الآن أن نتعلم كيف نستطيع إضافة البرامج بعد أن ثبتنا Supervisor على نظامنا.

إضافة برنامج

تضاف البرامج الجديدة إلى Supervisor عبر ملفات الضبط، التي تُعلِم Supervisor ما هو الملف التنفيذي الذي عليه تشغيله، وما هي متغيرات البيئة (environmental variables) التي يجب ضبطها، وآلية التعامل مع المخرجات. 

ملاحظة: جميع البرمجيات التي تعمل ضمن Supervisor يجب أن تُشغَّل في الأمامية ("foreground" وأحيانًا تسمى "non-daemonising"). فلو كان البرنامج -افتراضيًا- يشتق العملية fork ويشغل نفسه بالخلفية، فيجب أن تعود إلى دليل ذاك البرنامج لكي تعرف ما هو الخيار المستخدم لتفعيل هذا النمط، وإلا فلن يستطيع Supervisor تحديد حالة البرنامج تحديدًا صحيحًا. 

لغرض هذا الدرس، سنفترض وجود سكربت صَدَفة (shell script) الذي نريد أن نشغله بشكلٍ دائم والمحفوظ في المسار ‎/usr/local/bin/long.sh ويبدو كالآتي:

#!/bin/bash 
while true 
do 
	# Echo current date to stdout 
	echo `date` 

	# Echo 'error!' to stderr 
	echo 'error!' >&2 
	sleep 1 
done
chmod +x /usr/local/bin/long.sh

من الناحية العملية، السكربت السابق عديم الجدوى، لكنه يسمح لنا بتغطية أساسيات ضبط Supervisor. 

ملفات ضبط البرمجيات في Supervisor موجودةٌ في مجلد ‎/etc/supervisor/conf.d، يوضع عمومًا كل برنامج في ملف خاص به ذي اللاحقة ‎.conf مثالٌ عن ملف الضبط للسكربت الخاص بنا الذي سنحفظه في المسار ‎/etc/supervisor/conf.d/long_script.conf سيبدو كما يلي:

[program:long_script] 
command=/usr/local/bin/long.sh 
autostart=true 
autorestart=true 
stderr_logfile=/var/log/long.err.log 
stdout_logfile=/var/log/long.out.log

سننظر الآن لوظيفة وأهمية كل سطر من الأسطر السابقة، وسأخبرك بالتعديلات التي قد ترغب بإجرائها عند إضافة ملفات ضبط لبرامجك:

[program:long_script] 
command=/usr/local/bin/long.sh

يبدأ ملف الضبط بتعريف برنامج اسمه "long_script" ويُحدِّد المسار الكامل للبرنامج.

autostart=true
autorestart=true

السطران السابقان يُحدَّدان السلوك التلقائي الافتراضي للسكربت في مختلف الحالات. 

الخيار autostart يخبر Supervisor أنَّ البرنامج يجب أن يُشغَّل عند إقلاع النظام. ضبط هذه القيمة إلى false سيستوجب تشغيلًا يدويًا للبرنامج بعد كل إعادة إقلاع للنظام. 
الخيار autorestart يُحدِّد كيف على Supervisor أن يتعامل مع البرنامج في حال توقف عن العمل، وهنالك ثلاثة خيارات: 

  • false: إخبار Supervisor ألّا يعيد تشغيل البرنامج إطلاقًا بعد توقفه عن العمل 
  • true: إخبار Supervisor أن يعيد تشغيل البرنامج دومًا في حال توقف عن العمل 
  • unexpected: إخبار Supervisor أن يُعيد التشغيل في حال انتهى تنفيذ البرنامج بعد حدوث خطأ (افتراضيًا: أي قيمة ما عدا 0 و 2، وهذه القيمة هي قيمة حالة الخروج [exit status] التي يرسلها البرنامج بعد انتهاء تنفيذه).
stderr_logfile=/var/log/long.err.log 
stdout_logfile=/var/log/long.out.log

السطران الأخيران يُعرِّفان المسار الافتراضي لملفَي السجل الخاصَين بالبرنامج. وكما هو واضح من اسمَي الخيارين: سيُعاد توجيه مجرى الخرج القياسي (stdout) ومجرى الخطأ القياسي (stderr) إلى المسارَين الموجودَين في الخيارَين stdout_logfile و stderr_logfile على التوالي وبالترتيب. يجب أن يكون المجلد المُحدَّد موجودًا قبل تشغيل البرنامج، إذ لن يحاول Supervisor أن يُنشِئ أيّة مجلدات غير موجودة. 

الضبط الذي أنشأناه هو أقل ضبط ممكن لكي يعمل Supervisor. يحتوي التوثيق على خياراتِ ضبطٍ أخرى كثيرة لتخصيص كيفية تنفيذ البرنامج. 

بعد إنشاء وحفظ ملف الضبط، سنتمكن من إعلام Supervisor عن برنامجنا الجديد عبر الأمر supervisorctl. علينا أولًا أن نطلب من Supervisor أن يعيد قراءة ملفات الضبط الموجودة في مجلد ‎/etc/supervisor/conf.d عبر الأمر:

supervisorctl reread

ثم نُتبِعُ ذلك بالطلب منه أن يتصرف وفقًا لما تغيّر بالأمر:

supervisorctl update

عندما تُجري أيّة تعديلات على أي ملف ضبط لأي برنامج، فعليك تنفيذ الأمرين السابقين لتأخذ التعديلات مجراها. 

يجب أن يعمل برنامج الآن، ويمكنك التحقق من ذلك بالنظر إلى ناتج ملف السجل:

$ tail /var/log/long.out.log 
Sat Jul 20 22:21:22 UTC 2013 
Sat Jul 20 22:21:23 UTC 2013 
Sat Jul 20 22:21:24 UTC 2013 
Sat Jul 20 22:21:25 UTC 2013 
Sat Jul 20 22:21:26 UTC 2013 
Sat Jul 20 22:21:27 UTC 2013 
Sat Jul 20 22:21:28 UTC 2013 
Sat Jul 20 22:21:29 UTC 2013 
Sat Jul 20 22:21:30 UTC 2013 
Sat Jul 20 22:21:31 UTC 2013

إدارة البرامج

من المؤكد أنَّه سيحين وقتٌ تريد فيه أن توقف أو تعيد تشغيل أو ترى حالة برامجك المُشغَّلة. لدى برنامج supervisorctl -الذي استخدمناه في الأعلى- نمطٌ تفاعليٌ نستطيع عبره إعطاء أوامر للتحكم بالبرامج. 

أدخِل supervisorctl دون وسائط للدخول إلى النمط التفاعلي:

$ supervisorctl 
long_script 		RUNNING 		pid 12614, 
uptime 1:49:37 
supervisor>

سيعرض supervisorctl (عند تشغيله) حالة وزمن تشغيل جميع البرامج، وذلك متبوعٌ بإظهار مِحَث (prompt) لإدخال الأوامر. أدخِل الأمر help لإظهار جميع الأوامر التي نستطيع استخدامها:

supervisor> help 

default commands (type help ): 
===================================== 
add 	clear 	fg 	open 	quit 	remove 	restart 
start 	stop 	update 
avail 	exit 	maintail 	pid 	reload 	reread 	shutdown 
status 	tail 	version

يمكنك استخدام الأوامر start و stop و restart متبوعةً باسم البرنامج الذي تريد تشغيله أو إيقافه أو إعادة تشغيله على التوالي:

supervisor> stop long_script 
long_script: stopped 

supervisor> start long_script 
long_script: started 

supervisor> restart long_script 
long_script: stopped long_script: started

يمكنك استخدام الأمر tail لمشاهدة أحدث التغيرات التي طرأت في سجلات الخرج القياسي والخطأ القياسي في برنامجنا:

supervisor> tail long_script 
Sun Jul 21 00:36:10 UTC 2013 
Sun Jul 21 00:36:11 UTC 2013 
Sun Jul 21 00:36:12 UTC 2013 
Sun Jul 21 00:36:13 UTC 2013 
Sun Jul 21 00:36:14 UTC 2013 
Sun Jul 21 00:36:15 UTC 2013 
Sun Jul 21 00:36:17 UTC 2013 

supervisor> tail long_script stderr 
error! 
error! 
error! 
error! 
error! 
error! 
Error!

يمكننا عرض حالة البرامج عبر الأمر status للتأكد من وضعها بعد إجراء أيّة تعديلات على إحداها:

supervisor> status long_script 
STOPPED Jul 21 01:07 AM

وفي النهاية، يمكنك الخروج من النمط التفاعلي بالضغط على Ctrl-C أو بكتابة quit في المِحَث:

supervisor> quit

هذا كل ما في الأمر! لقد تعلمتَ أساسيات إدارة البرامج دائمة التشغيل عبر Supervisor، ولن يصعب عليك فعل المِثل لبقية برامجك. إذا كانت لديك أيّة استفسارات، فاسألها في التعليقات. 

ترجمة -وبتصرّف- للمقال How To Install and Manage Supervisor on Ubuntu and Debian VPS.





تفاعل الأعضاء


لا توجد أيّة تعليقات بعد



يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن