إدارة الخدمات باستخدام (systemd) و (systemctl)


أهلاً بك، يا مهندس لينكس! اليوم سنتكلم عن العمود الفقري لإدارة الخدمات في معظم توزيعات لينكس الحديثة: systemd وأداة التحكم الخاصة به systemctl. انسَ init.d القديم، هذا هو المستقبل (والحاضر!).

ما هو systemd؟ ولماذا هو مهم؟

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

ملاحظة سريعة: معظم التوزيعات الكبرى مثل CentOS/RHEL، Ubuntu (منذ 15.04)، Debian، Fedora تستخدم systemd. لذا، فهمه ضروري.

أداة systemctl: مفتاحك للتحكم

systemctl هي الأداة التي تتفاعل بها مع systemd. باستخدامها، يمكنك عرض حالة الخدمات، بدءها، إيقافها، إعادة تشغيلها، وتمكينها أو تعطيلها عند الإقلاع.

1. التحقق من حالة خدمة

لترى ما إذا كانت خدمة معينة تعمل، هل هي ممكنة عند الإقلاع، وما هي آخر سجلاتها:


systemctl status apache2
# أو لخادم SSH
systemctl status sshd

ستحصل على معلومات مفصلة مثل "Active: active (running)", "Loaded", وآخر سطور من السجل.

2. بدء، إيقاف، وإعادة تشغيل الخدمات

هذه هي الأوامر الأكثر استخداماً:

  • بدء خدمة:
  • 
        systemctl start service_name
        # مثال: systemctl start nginx
        
  • إيقاف خدمة:
  • 
        systemctl stop service_name
        # مثال: systemctl stop postgresql
        
  • إعادة تشغيل خدمة:
  • هذا يوقف الخدمة ثم يعيد تشغيلها.

    
        systemctl restart service_name
        # مثال: systemctl restart php-fpm
        
  • إعادة تحميل إعدادات خدمة (بدون إعادة تشغيل كاملة):
  • إذا كانت الخدمة تدعم إعادة تحميل الإعدادات دون توقف، فهذا الخيار أفضل. مفيد جداً لخوادم الويب مثل Apache و Nginx بعد تغيير ملفات الإعداد.

    
        systemctl reload service_name
        # مثال: systemctl reload apache2
        
  • إعادة تشغيل أو إعادة تحميل:
  • يحاول إعادة التحميل أولاً، وإذا لم يكن مدعوماً، يقوم بإعادة التشغيل.

    
        systemctl reload-or-restart service_name
        

3. تمكين وتعطيل الخدمات عند الإقلاع

هذا يحدد ما إذا كانت الخدمة ستبدأ تلقائياً عند بدء تشغيل النظام أم لا.

  • تمكين خدمة:
  • ينشئ رابطاً رمزياً (symlink) لملف الوحدة في الدليل المناسب لـ systemd لبدء الخدمة عند الإقلاع.

    
        systemctl enable service_name
        # مثال: systemctl enable httpd
        
  • تعطيل خدمة:
  • يزيل الرابط الرمزي، مما يمنع الخدمة من البدء تلقائياً.

    
        systemctl disable service_name
        # مثال: systemctl disable postfix
        

4. إخفاء وإظهار الخدمات (Mask/Unmask)

mask يمنع بدء تشغيل الخدمة تماماً، حتى يدوياً أو عن طريق خدمة أخرى تعتمد عليها. يقوم بإنشاء رابط رمزي من ملف الوحدة إلى /dev/null.

  • إخفاء خدمة:
  • 
        systemctl mask service_name
        
  • إظهار خدمة:
  • 
        systemctl unmask service_name
        

عرض الوحدات (Units)

systemd لا يدير الخدمات فقط، بل يدير "وحدات" (units) أخرى مثل نقاط التحميل (mount points)، المقابس (sockets)، الأجهزة (devices)، وغيرها. يمكنك عرضها باستخدام systemctl.

1. عرض جميع الوحدات النشطة


systemctl list-units

هذا سيعرض لك قائمة طويلة من جميع الوحدات المحملة والنشطة.

2. عرض الوحدات من نوع معين

إذا أردت فقط رؤية الخدمات (services):


systemctl list-units --type=service

أو فقط المقابس (sockets):


systemctl list-units --type=socket

3. عرض الوحدات الفاشلة

هذا مفيد جداً لاستكشاف الأخطاء وإصلاحها:


systemctl --failed

التعامل مع ملفات الوحدات (Unit Files)

كل خدمة أو وحدة يديرها systemd لها ملف تعريف يسمى "ملف الوحدة" (unit file). هذه الملفات هي نصوص عادية تحدد كيفية عمل الوحدة.

1. أين توجد ملفات الوحدات؟

عادة ما تجدها في هذه المسارات:

  • /etc/systemd/system/: للوحدات المخصصة من قبل المسؤول أو التي تجاوزت إعدادات الوحدات الافتراضية.
  • /run/systemd/system/: للوحدات التي تم إنشاؤها في وقت التشغيل.
  • /usr/lib/systemd/system/: للوحدات التي تأتي مع الحزم المثبتة (لا تعدل هذه الملفات مباشرة!).

عندما تقوم بـ enable خدمة، يقوم systemctl بإنشاء رابط رمزي من /etc/systemd/system/multi-user.target.wants/ (أو ما شابه) إلى ملف الوحدة الفعلي في /usr/lib/systemd/system/.

2. إنشاء خدمة مخصصة (مثال بسيط)

لنفترض أنك تريد تشغيل سكريبت بسيط كخدمة. سنقوم بإنشاء خدمة تسمى myfirstservice.service.

  1. إنشاء السكريبت:
  2. قم بإنشاء ملف /usr/local/bin/myscript.sh بالمحتوى التالي:

    
        #!/bin/bash
        echo "Hello from my first systemd service!" >> /tmp/myfirstservice.log
        exit 0
        

    اجعل السكريبت قابلاً للتنفيذ:

    
        chmod +x /usr/local/bin/myscript.sh
        
  3. إنشاء ملف الوحدة:
  4. قم بإنشاء ملف /etc/systemd/system/myfirstservice.service بالمحتوى التالي:

    
        [Unit]
        Description=My First Custom Systemd Service
        After=network.target
    
        [Service]
        Type=oneshot
        ExecStart=/usr/local/bin/myscript.sh
        RemainAfterExit=yes
    
        [Install]
        WantedBy=multi-user.target
        

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

    • [Unit]: معلومات عامة عن الوحدة (الوصف، التبعيات). After=network.target يعني أن خدمتنا ستبدأ بعد أن تكون الشبكة جاهزة.
    • [Service]: يصف نوع الخدمة وكيفية تشغيلها.
      • Type=oneshot: يعني أن الأمر سينفذ مرة واحدة ويخرج.
      • ExecStart: الأمر الذي سيتم تنفيذه.
      • RemainAfterExit=yes: يحافظ على حالة الخدمة "نشطة" حتى بعد انتهاء الأمر.
    • [Install]: يحدد كيفية "تثبيت" الخدمة (تمكينها). WantedBy=multi-user.target يعني أنها جزء من بيئة المستخدمين المتعددين (الوضع الطبيعي للخوادم).

  5. إعادة تحميل systemd daemon:
  6. بعد إنشاء أو تعديل ملف وحدة، يجب إخبار systemd لإعادة تحميل إعداداته:

    
        systemctl daemon-reload
        
  7. بدء وتمكين الخدمة:
  8. 
        systemctl start myfirstservice.service
        systemctl enable myfirstservice.service
        
  9. التحقق من الحالة:
  10. 
        systemctl status myfirstservice.service
        cat /tmp/myfirstservice.log
        

    يجب أن ترى "Hello from my first systemd service!" في ملف السجل.

نصيحة إضافية: Journalctl للسجلات

systemd يأتي مع نظام تسجيل خاص به يسمى journald. يمكنك عرض سجلات الخدمات باستخدام journalctl.


journalctl -u service_name
# مثال: journalctl -u nginx.service

# لعرض آخر 100 سطر
journalctl -u service_name -n 100

# لعرض السجلات مباشرة (مثل tail -f)
journalctl -f -u service_name

هذا الأمر لا غنى عنه لاستكشاف أخطاء الخدمات وإصلاحها.

الخاتمة

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

لديك أسئلة؟ لا تتردد في طرحها!