إدارة الخدمات باستخدام (systemd) و (systemctl)
إدارة الخدمات باستخدام systemd وsystemctl
تُعد إدارة الخدمات من أهم المهام اليومية في لينكس، خصوصاً على الخوادم وبيئات الإنتاج. وفي أغلب التوزيعات الحديثة أصبح systemd هو نظام الإقلاع ومدير الخدمات الافتراضي، وهو المسؤول عن تشغيل الخدمات، مراقبتها، إعادة تشغيلها عند الحاجة، وربطها بمراحل إقلاع النظام المختلفة. فهم هذا النظام يمنحك قدرة عملية على إدارة خوادم الويب وقواعد البيانات ووحدات الخلفية بكفاءة أعلى.
إذا كنت قد قرأت سابقاً مقال مقدمة إلى عالم لينكس: التاريخ، الفلسفة، وفهم النواة (Kernel) فستعرف أن النواة تدير الموارد الأساسية، لكن تشغيل الخدمات فوقها يتم عبر طبقة تنظيمية متقدمة مثل systemd. أما التعامل العملي اليومي فيتم غالباً بأداة systemctl التي تُعد واجهتك الأساسية للإدارة.
ما هو systemd ولماذا هو مهم؟
systemd ليس مجرد بديل لأسلوب init التقليدي، بل منظومة متكاملة لإدارة الوحدات units. هذه الوحدات قد تمثل خدمة، مقبساً، جهازاً، نقطة تركيب، أو هدف إقلاع target.
تكمن أهميته في أنه يوفّر تشغيل متوازي للخدمات، إدارة تبعيات دقيقة، سجلات مركزية، وسياسات واضحة لإعادة التشغيل عند الفشل. وهذا مهم جداً في البيئات الإنتاجية، خصوصاً عندما تكون الخدمة الحرجة مثل nginx أو mysql أو تطبيقك المخصص بحاجة إلى استقرار وتشغيل تلقائي موثوق.
الفرق بين systemd وsystemctl
من الأخطاء الشائعة الخلط بين المفهومين. systemd هو النظام نفسه، بينما systemctl هي أداة التحكم به من الطرفية. لذلك، عندما تريد تشغيل خدمة أو إيقافها أو فحص حالتها، فأنت تستخدم systemctl.
ولمن لا يزال في بداية التعامل مع سطر الأوامر، قد يكون من المفيد مراجعة الدخول الأول إلى الطرفية (Terminal): الأوامر الأساسية والمساعدة (man, help) لأن أغلب عمليات إدارة الخدمات تتم من خلال واجهة الأوامر مباشرة.
فهم وحدات الخدمة ومواقع ملفاتها
تعتمد الخدمات في systemd على ملفات تعريف تنتهي غالباً بالامتداد .service. تحتوي هذه الملفات على معلومات مثل أمر التشغيل، المستخدم الذي ستعمل الخدمة باسمه، وسياسة إعادة التشغيل، وتبعيات الإقلاع.
غالباً ستجد هذه الملفات في مسارات مثل /etc/systemd/system أو /usr/lib/systemd/system. وهنا يظهر الارتباط المباشر مع هيكلية ملفات لينكس (Filesystem Hierarchy Standard – FHS) لأن فهم أماكن ملفات الوحدات يسهل عليك التعديل والتتبع دون عشوائية.
أهم أوامر systemctl في الإدارة اليومية
في العمل الفعلي، هناك مجموعة صغيرة من الأوامر ستستخدمها باستمرار. إتقان هذه الأوامر يمنحك تحكماً مباشراً في دورة حياة الخدمة من التشغيل حتى التشخيص.
تشغيل الخدمة وإيقافها وإعادة تشغيلها
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx
أمر reload مهم عندما تدعم الخدمة إعادة تحميل الإعدادات دون إيقاف كامل، وهو أفضل من restart في بعض السيناريوهات الإنتاجية لتقليل الانقطاع.
فحص حالة الخدمة
systemctl status nginx
يعرض هذا الأمر حالة الوحدة، ومعرّف العملية، آخر السجلات المختصرة، وحالة التفعيل. وهو مكمل عملي لما تعلمته في فهم العمليات (Processes) ومراقبة استهلاك الموارد (top, htop, ps, kill) لأن الخدمة في النهاية ترتبط بعمليات فعلية داخل النظام.
تفعيل الخدمة عند الإقلاع أو تعطيلها
sudo systemctl enable nginx
sudo systemctl disable nginx
التفعيل لا يعني التشغيل الفوري، بل يعني إنشاء الربط المناسب لتعمل الخدمة تلقائياً أثناء الإقلاع. أما إن أردت تنفيذ الأمرين معاً في خطوة واحدة، فيمكنك استخدام enable --now.
عرض جميع الخدمات والوحدات
systemctl list-units --type=service
systemctl list-unit-files --type=service
الأمر الأول يعرض الوحدات المحمّلة حالياً، بينما الثاني يوضح ملفات الوحدات وحالة تمكينها. هذا مفيد عند التدقيق على خادم يحتوي عدداً كبيراً من الخدمات.
قبل إيقاف أو تعطيل أي خدمة على خادم إنتاج، تأكد من فهم دورها الكامل واعتماد التطبيقات الأخرى عليها، لأن بعض الخدمات تبدو ثانوية بينما هي أساسية لطبقة الشبكة أو التسجيل أو الجدولة.
قراءة ملفات الخدمة وتحليل إعداداتها
لفهم سبب سلوك خدمة ما، يجب الاطلاع على تعريفها. يمكنك عرض ملف الوحدة الحالي ومعرفة إن كان هناك تخصيصات محلية أو تجاوزات overrides.
systemctl cat nginx
systemctl show nginx
systemctl show nginx --property=ExecStart,Restart,User
عند قراءة هذه الإعدادات، ستلاحظ توجيهات مثل ExecStart وRestart وAfter. هذه هي العناصر التي تحدد كيف تبدأ الخدمة، ومتى يُعاد تشغيلها، وما الذي يجب أن يكون جاهزاً قبلها.
إنشاء خدمة مخصصة لتطبيقك
من أقوى ميزات systemd أنك تستطيع تحويل أي سكربت أو تطبيق خلفي إلى خدمة مستقرة قابلة للمراقبة. هذا أفضل بكثير من تشغيل التطبيق يدوياً في جلسة طرفية وتركه عرضة للتوقف.
في المثال التالي سننشئ خدمة بسيطة لتطبيق يعمل بواسطة Bash:
sudo nano /etc/systemd/system/myapp.service
[Unit]
Description=My Custom App
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/start.sh
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
بعد حفظ الملف، ستحتاج إلى إعادة تحميل تعريفات الوحدات ثم تشغيل الخدمة وتمكينها:
sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl enable myapp
sudo systemctl status myapp
إذا كان التطبيق أو السكربت يعتمد على أذونات محددة، فراجع أيضاً إدارة الصلاحيات والملكية (Chmod, Chown, Sudo) لأن كثيراً من مشاكل فشل الخدمات يكون سببها المستخدم الخاطئ أو نقص صلاحية الوصول إلى الملفات.
استكشاف الأعطال وتشخيص المشكلات
عندما تفشل خدمة في الإقلاع، لا يكفي تنفيذ restart بشكل متكرر. المنهج الاحترافي يبدأ بقراءة الحالة، ثم السجلات، ثم اختبار الأمر التنفيذي نفسه.
systemctl status myapp
journalctl -u myapp -n 50 --no-pager
journalctl -u myapp -f
سيساعدك ذلك على معرفة ما إذا كانت المشكلة في مسار ملف، متغير بيئة، منفذ مستخدم مسبقاً، أو فشل صلاحيات. وفي كثير من الحالات ستحتاج إلى استخدام أدوات مثل grep وtail وعمليات الأنابيب وإعادة التوجيه (Pipes and Redirections: |, >, >>) لتحليل السجلات بكفاءة أكبر.
إذا عدّلت ملف خدمة ولم تُنفذ
systemctl daemon-reloadفلن يلتقطsystemdالتغييرات الجديدة، وستظن خطأً أن التعديل لم ينجح.
أفضل ممارسات عملية لإدارة الخدمات
- استخدم
restart=on-failureبدلاً من إعادة التشغيل العشوائي الدائم عندما يكون ذلك مناسباً. - شغّل الخدمة بمستخدم محدود الصلاحيات كلما أمكن، وتجنب
rootإلا عند الضرورة. - احتفظ بملفات التطبيق والسجلات والإعدادات في مسارات منطقية ومتوافقة مع بنية النظام.
- اختبر أمر
ExecStartيدوياً قبل تحويله إلى خدمة. - وثّق أي تعديلات محلية على الوحدات، خاصة على الخوادم المشتركة بين فرق متعددة.
خلاصة
إتقان systemd وsystemctl ينقلك من مستوى الاستخدام العادي للينكس إلى مستوى الإدارة الاحترافية. أنت لا تكتفي بتشغيل خدمة أو إيقافها، بل تفهم دورة حياتها، تبعياتها، سلوكها عند الفشل، وآلية دمجها مع إقلاع النظام.
ومع ازدياد اعتماد البنى الحديثة على الخدمات الخلفية والعمليات المستمرة، تصبح هذه المهارة أساسية لأي مسؤول نظام، مطور DevOps، أو صاحب مشروع يستضيف تطبيقاته على لينكس. كلما فهمت الوحدات أكثر وقرأت سجلاتها بعمق، أصبح تشخيصك أسرع وبيئتك الإنتاجية أكثر استقراراً.
27 comments