أعاد مراقبنا تشغيل الخدمات التي أوقفناها عمدًا
العمليات
يبدأ أحد مراقبينا أيًّا من خدماتنا المفعّلة وغير العاملة. وفي مناسبتين خلال أكتوبر، بدأ خدمات أوقفناها عمدًا. وفي المرة الثانية، واجه زوار أحد مواقعنا أخطاءً لمدة 45 دقيقة تقريبًا.
سبب وجود هذا المراقب
الخدمة التي تخرج بشكل نظيف عند استلامها إشارة SIGTERM، على سبيل المثال لأن شيئًا ما أنهى عملها بالاسم، لا تُعتبر "فاشلة" من منظور systemd. فلا يعيدها Restart=on-failure إلى العمل، ولا تظهر في قائمة systemctl --failed. وتبقى متوقفة حتى يلاحظها أحد بالصدفة. لذا يبحث المراقب عن الخدمات المفعّلة وغير العاملة، ثم يشغّلها.
المشكلة هي أن الخدمة التي أوقفتها يدويًا تبدو تمامًا كما هي.
المرة الأولى
في 7 أكتوبر، أوقفنا عامل فيديو باستخدام systemctl stop في الساعة 12:47 لتعديل قائمة مهامه. وفي الساعة 12:55 كان يعمل مجددًا: إذ بدأه المراقب.
المرة الثانية
في 21 أكتوبر، احتجنا إلى ذاكرة الجهاز الذي يخدم أيضًا موقعين من مواقعنا لإجراء اختبار نموذج. أوقف نص برمجي تطبيقات الويب الخاصة بالموقعين، ومهمة مزامنة، وحاوية قاعدة بيانات، مرة أخرى باستخدام systemctl stop. وبعد حوالي خمس دقائق، أعاد مؤقّت يراقب المواقع، ثم المراقب في الساعة 19:14، تشغيل النفق وتطبيقات الويب.
استأنف النفق استقبال حركة المرور، لكن تطبيقات الويب لم تستطع الرد: إذ استحوذ النموذج قيد الاختبار على 114 GiB من ذاكرة الجهاز. ومن حوالي الساعة 19:14 إلى 20:00، تلقى بعض الزوار أخطاء 502. وفي الساعة 20:00، عطّلنا النفق وتطبيقات الويب ومهمة المزامنة، وأوقفنا مؤقّت المراقبة.
القاعدة التي نستخدمها الآن
- أوقف الخدمة مؤقتًا بتعطيلها:
sudo systemctl disable --now <unit>. أعد تشغيلها باستخدامsudo systemctl enable --now <unit>. يراقب مراقبنا الخدمات المفعّلة فقط، لذا يترك الخدمات المعطّلة دون تدخل. - أوقف مؤقتًا كل ما يمكنه إعادتها للعمل: النفق الذي يسبقها وأي مؤقّت يراقبها.
- الإيقاف القصير سباق مع الزمن. إذا استخدمت
stopفقط، فأنهِ عملك قبل الفحص التالي، الذي يحدث على أجهزتنا خلال دقائق.
مفخختان أخريان من systemd من الأشهر نفسها
- لا يُجدي نفعًا تنفيذ
systemctl mask --runtimeعلى ملف وحدة موجود في /etc/systemd/system. تحظى الوحدات في /etc بأولوية على القناع المؤقت في /run، لذا ينجح الأمر وتظل الخدمة تعمل. لإيقاف خدمة مؤقتًا، نستخدم ملف drop-in يحتوي علىConditionPathExists=!/etc/<name>.hold: فطالما أن هذا الملف موجود، لن تبدأ الخدمة، لا عند الإقلاع ولا يدويًا. - يعتبر
systemctl is-activeخدمة oneshot قيد التشغيل غير نشطة. أثناء تشغيل خدمة من النوعType=oneshot، تكون حالتها "activating"، لذا يطبعis-activeهذه الحالة ويعيد القيمة 3. فحلقة مثلwhile systemctl is-active --quiet job.service; do sleep 60; done، المصممة لانتظار مهمة ليلية، تخرج فورًا. اقرأ الحالة بدلاً من ذلك: فالحالات active، وactivating، وreloading، وdeactivating كلها تعني أنها لا تزال تعمل.
يراقب Factory Floor الخدمات المفعّلة وغير العاملة. افتراضيًا، يكتفي بالإبلاغ عنها، ولا يشغّلها إلا إذا فعّلت هذا الخيار. منذ الإصدار 1.0.3، يتضمن تنبيهه أيضًا كيفية إيقاف خدمة عمدًا، وينص دليل التشغيل (runbook) على الأمر نفسه.