أهلاً بك، يا مهندس لينكس! اليوم سنتكلم عن العمود الفقري لإدارة الخدمات في معظم توزيعات لينكس الحديثة: 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.
- إنشاء السكريبت:
- إنشاء ملف الوحدة:
[Unit]: معلومات عامة عن الوحدة (الوصف، التبعيات).After=network.targetيعني أن خدمتنا ستبدأ بعد أن تكون الشبكة جاهزة.[Service]: يصف نوع الخدمة وكيفية تشغيلها.Type=oneshot: يعني أن الأمر سينفذ مرة واحدة ويخرج.ExecStart: الأمر الذي سيتم تنفيذه.RemainAfterExit=yes: يحافظ على حالة الخدمة "نشطة" حتى بعد انتهاء الأمر.
[Install]: يحدد كيفية "تثبيت" الخدمة (تمكينها).WantedBy=multi-user.targetيعني أنها جزء من بيئة المستخدمين المتعددين (الوضع الطبيعي للخوادم).- إعادة تحميل systemd daemon:
- بدء وتمكين الخدمة:
- التحقق من الحالة:
قم بإنشاء ملف /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
قم بإنشاء ملف /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
شرح سريع لملف الوحدة:
بعد إنشاء أو تعديل ملف وحدة، يجب إخبار systemd لإعادة تحميل إعداداته:
systemctl daemon-reload
systemctl start myfirstservice.service
systemctl enable myfirstservice.service
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 هما أداتان قويتان ولا غنى عنهما لأي مهندس أنظمة لينكس. إتقانهما سيجعل حياتك أسهل بكثير في إدارة الخوادم والخدمات. تدرب على هذه الأوامر، وستصبح جزءاً من ذاكرتك العضلية قريباً.
لديك أسئلة؟ لا تتردد في طرحها!