إدارة الخدمات باستخدام Runit وإنشاء خدمات

بسم الله الرحمن الرحيم
الحمد لله رب العالمين والصلاة و السلام على سيد المرسلين، سيدنا محمد عليه أفضل الصلاة و أتم التسليم

تمهيد

رنت هو نظام بدء init خفيف الوزن وقوي لإدارة الخدمات في أنظمة التشغيل الشبيهة بيونكس. تم تصميمه ليكون بسيطًا وموثوقًا وسريعًا، مما يجعله خيارًا شائعًا لإدارة الخدمات في البيئات البسيطة والحاوية (containerized environments).
في هذا المقال، سنستعرض كيفية إدارة الخدمات باستخدام Runit وكيفية إنشاء خدمات مخصصة مع مثال توضيحي.


ما هو Runit؟

كما مهدنا فإن Runit هو بديل لأنظمة البدء التقليدية مثل SysVinit أو systemd. يتبع فلسفة يونكس في القيام بشيء واحد بشكل جيد: إدارة الخدمات. يتكون Runit من ثلاثة مكونات رئيسية:

  1. runit-init: عملية البدء التي تبدأ النظام وتدير مستويات التشغيل (runlevels).
  2. runsvdir: برنامج خفي (daemon) يراقب أدلة الخدمات ويبدأ/يوقف الخدمات حسب الحاجة.
  3. runsv: المشرف على العمليات الذي يدير الخدمات الفردية.

يستخدم Runit على نطاق واسع في توزيعات مثل Void Linux وغالبًا ما يُفضل بسبب بساطته وموثوقيته.


إدارة الخدمات باستخدام Runit

يدير Runit الخدمات من خلال الأدلة والروابط الرمزية (symbolic links). يتم تمثيل كل خدمة بدليل يحتوي على نص run، والذي يحدد كيفية بدء الخدمة. توجد الخدمات عادةً في /etc/sv/، ويتم تمكين الخدمات عن طريق إنشاء روابط رمزية في /var/service/.

ملاحظة: تختلف كل توزيعة ونظام التشغيل عن ملف الخدمات ولكن معظمها تجدها في /etc/sv/ .

الأوامر الشائعة لإدارة الخدمات

  1. بدء خدمة:
    لبدء خدمة، أنشئ رابطًا رمزيًا في /var/service/ يشير إلى دليل الخدمة في /etc/sv/.
sudo ln -s /etc/sv/myservice /var/service/

بحيث أن myservice اسم الخدمة ولتكن مثلاُ mysqld فإن :

sudo ln -s /etc/sv/mysqld /var/service/

سيقوم Runit تلقائيًا ببدء الخدمة.

  1. إيقاف خدمة:
    لإيقاف خدمة، قم بإزالة الرابط الرمزي من /var/service/.
sudo rm /var/service/myservice

ملاحظة: أفضل شخصياً بإستخدام الأمر unlink لإيقاف الخدمات مثل :

sudo unlink /var/service/myservice 

سيقوم Runit بإيقاف الخدمة وتنظيفها.

  1. فحص حالة الخدمة:
    استخدم الأمر sv status للتحقق من حالة الخدمة.
 sudo  sv status /var/service/myservice
  1. إعادة تشغيل خدمة:
    استخدم الأمر sv restart لإعادة تشغيل خدمة.
sudo sv restart /var/service/myservice
  1. تمكين خدمة عند بدء التشغيل:
    يتم تمكين الخدمات تلقائيًا عند بدء التشغيل إذا كانت مرتبطة برمزية في /var/service/.

إنشاء خدمات مخصصة باستخدام Runit

إنشاء خدمة مخصصة في Runit أمر بسيط. تحتاج إلى إنشاء دليل خدمة يحتوي على نص run واختياريًا نص finish.

مثال: إنشاء خدمة مخصصة لخادم HTTP بسيط باستخدام Python

لنقم بإنشاء خدمة مخصصة لتشغيل خادم HTTP بسيط باستخدام Python.

  1. إنشاء دليل الخدمة:
    أنشئ دليلًا للخدمة في /etc/sv/.
sudo mkdir -pv /etc/sv/pyhttpserver
  1. إنشاء نص run:
    نص run هو نص برمجي يحدد كيفية بدء الخدمة. أنشئ ملفًا باسم run في دليل الخدمة:
sudo nano /etc/sv/pyhttpserver/run

أضف المحتوى التالي إلى نص run:

#!/bin/sh
exec python3 -m http.server -d /home 8080

اجعل النص البرمجي قابلًا للتنفيذ:

sudo chmod +x /etc/sv/pyhttpserver/run
  1. إنشاء نص finish (اختياري):
    يتم تنفيذ نص finish عند إيقاف الخدمة. يمكن استخدامه لمهام التنظيف. أنشئ ملفًا باسم finish في دليل الخدمة:
sudo nano /etc/sv/pyhttpserver/finish

أضف المحتوى التالي إلى نص finish:

#!/bin/sh
echo "تم إيقاف خادم HTTP الخاص بـ Python."

اجعل النص البرمجي قابلًا للتنفيذ:

sudo chmod +x /etc/sv/pyhttpserver/finish
  1. تمكين الخدمة:
    أنشئ رابطًا رمزيًا في /var/service/ لتمكين الخدمة:
sudo ln -s /etc/sv/pyhttpserver /var/service/

سيقوم Runit ببدء خادم HTTP الخاص بـ Python على الفور.

  1. التحقق من الخدمة:
    تحقق من حالة الخدمة باستخدام الأمر التالي:
sudo sv status /var/service/pyhttpserver

يجب أن ترى نتيجة مشابهة للآتي:

run: /var/service/pyhttpserver: (pid 1234) 5s

يمكنك الوصول إلى خادم HTTP عن طريق زيارة http://localhost:8080 في متصفحك.

مثال آخر ولكن مع تحديد الصلاحيات

في بعض الأحيان نريد أن نحدد المجموعة و المستخدمين لخدمة معينة، فإننا نستخدم الأمر chpst كما سنرى الآن مع تشغيل ايماكس:

  1. إنشاء دليل الخدمة:
    أنشئ دليلًا للخدمة في /etc/sv/.
sudo mkdir -pv /etc/sv/runemacs
  1. إنشاء نص run:
    نص run هو نص برمجي يحدد كيفية بدء الخدمة. أنشئ ملفًا باسم run في دليل الخدمة:
sudo nano /etc/sv/runemacs/run

أضف المحتوى التالي إلى نص run:

#!/bin/sh
exec chpst -u mohammed:users emacs -u mohammed --fg-daemon 2>&1

بحيث أن ايماكس سيعمل مع المستخدم mohammed أو مع مجموعة users كما هو في صفحة الدليل مع الخيار -u، اﻵن اجعل النص البرمجي قابلًا للتنفيذ:

sudo chmod +x /etc/sv/runemacs/run
  1. تمكين الخدمة:
    أنشئ رابطًا رمزيًا في /var/service/ لتمكين الخدمة:
sudo ln -s /etc/sv/runemacs /var/service/

التخصيص المتقدم

التسجيل (Logging)

يمكن لـ Runit التعامل مع تسجيل النتائج تلقائيًا لخدمتك. لتمكين التسجيل، أنشئ دليل log داخل دليل الخدمة وأضف نص run للمسجل.

  1. إنشاء دليل التسجيل:
sudo mkdir -p /etc/sv/pyhttpserver/log
  1. إنشاء نص run للتسجيل:
sudo  nano /etc/sv/pyhttpserver/log/run

أضف المحتوى التالي:

 #!/bin/sh
 exec svlogd -tt ./main

اجعل النص البرمجي قابلًا للتنفيذ:

sudo chmod +x /etc/sv/pyhttpserver/log/run

سيتم تسجيل ناتج الخدمة في /etc/sv/pyhttpserver/log/main/.


الخاتمة

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

3 إعجابات