المستوى: متوسط — الشرح ده موجّه لمهندس عنده خدمة شغّالة على سيرفر لينكس (VPS) ويعرف أساسيات الطرفية وsystemctl. مش محتاج خبرة عميقة في الـ DevOps، بس تكون سبق شغّلت خدمة بـ systemd.
في آخر الدليل ده هيكون عندك خدمة بترجّع نفسها تلقائيًا خلال ثوانٍ بعد أي كراش، بتحمي نفسها من لوب إعادة التشغيل، وبتبعتلك تنبيه لحظة ما تستسلم فعلًا. من غير ما تصحى الساعة 3 الفجر.
الشفاء الذاتي للخدمات على لينكس بـ systemd
المشكلة باختصار
خدمتك وقعت الساعة 2 بالليل. العميل اكتشفها الساعة 9 الصبح. إنت اكتشفتها من شكوى العميل. الفجوة دي — من لحظة الكراش لحظة ما حد يعمل حاجة — اسمها MTTR (متوسط زمن الاستعادة). وأغلب الوقت بيضيع في إن محدش عارف إن فيه حاجة وقعت أصلًا.
الطريقة الشائعة إن الناس بتفتكر إن systemctl start مرة واحدة كفاية. غلط. الخدمة أول ما تكرش، بتفضل ميتة لحد ما حد يدخل يدويًا. الحل مش سكربت cron بيتأكد كل دقيقة — ده بيضيف تأخير ومشاكل. الحل إن systemd نفسه يراقب الخدمة ويصلّحها، وده شغله الأصلي.
المثال الأول: الحارس اللي بيفتح الباب كل ما يتقفل
تخيّل حارس واقف على باب. كل ما الباب يتقفل بالغلط، بيفتحه تاني على طول. بس لو الباب اتقفل 5 مرات في دقيقة، الحارس بيفهم إن فيه مشكلة حقيقية (مش صدفة)، فبيبطّل يفتح ويرنّ جرس ينبّه المدير. ده بالظبط اللي بيعمله systemd: إعادة تشغيل سريعة للأعطال العابرة، ووقفة وتنبيه للأعطال المتكررة.
علميًا: systemd هو مدير العمليات (init/PID 1) في أغلب توزيعات لينكس. هو اللي بيشغّل خدمتك ويراقب حالتها. لمّا العملية بتخرج بكود غير صفري أو بتتقتل بإشارة، systemd بيقدر يعيد تشغيلها تلقائيًا حسب سياسة إنت بتحددها في ملف الوحدة (unit file).
الطبقة 1: إعادة التشغيل التلقائي مع back-off
أضف السطرين Restart وRestartSec في قسم [Service]. Restart=on-failure بيعيد التشغيل فقط عند الفشل (خروج غير صفري، إشارة قتل، timeout، أو Watchdog)، ومش بيعيد لو الخدمة خرجت بنجاح بكود صفر — وده اللي إنت عايزه.
# /etc/systemd/system/myapp.service
[Unit]
Description=My App API
StartLimitIntervalSec=60
StartLimitBurst=5
OnFailure=notify-failure@%n.service
[Service]
Type=notify
ExecStart=/usr/bin/python3 /opt/myapp/app.py
Restart=on-failure
RestartSec=2
WatchdogSec=30
User=myapp
[Install]
WantedBy=multi-user.target
RestartSec=2 بتخلّي systemd يستنى ثانيتين قبل كل محاولة، بدل ما يفضل يحاول في نفس اللحظة ويخنق السيرفر. ده الـ back-off البسيط.
الطبقة 2: احرس اللوب — امنع عاصفة إعادة التشغيل
الخطر الحقيقي: خدمة بتكرش فورًا كل ما تقوم (مثلًا بسبب config غلط). من غير حارس، systemd هيفضل يقوم ويقع آلاف المرات في الثانية ويحرق المعالج. هنا بييجي دور و في قسم .