المستوى: مبتدئ — لأي حد بيشغّل cron job أو سكربت مجدول وعايز يعرف إنه فشل قبل ما العميل يكتشفه.
أتمتة مراقبة الـ Cron Jobs بنمط Dead Man's Switch
في آخر المقال هيكون عندك سكربت جاهز يبعتلك تنبيه خلال أقل من 5 دقائق من أول ما مهمة مجدولة تفشل أو تتأخر، من غير ما تفتح السيرفر وتتفقد بإيدك.
المشكلة باختصار
الـ cron job ليه مشكلة خبيثة. لما ينجح بيشتغل في صمت، ولما يفشل بيفشل في صمت برضه. مفيش حد بيتصل بيك يقولك إن النسخة الاحتياطية وقفت من 9 أيام.
أغلب الناس بتراقب ظهور الأخطاء. لكن الـ cron اللي بيموت مبيطلّعش خطأ، هو ببساطة مبيشتغلش. ومحدش بيراقب حاجة مبتحصلش. النتيجة إنك بتكتشف الكارثة وقت ما تحتاج الباكب فعلاً وتلاقيه مش موجود.
الفكرة بمثال: حارس القطار
زمان كان في قطارات فيها زرار جنب السائق لازم يضغط عليه كل فترة. طول ما هو بيضغط، القطار ماشي. أول ما يسكت، يا إما نام يا إما حصله حاجة، القطار يفرمل لوحده.
ركز في المنطق المقلوب هنا. مفيش حد بيراقب هل في مشكلة. اللي بيتراقب هو غياب إشارة "أنا كويس". السكوت نفسه هو الإنذار.
نمط Dead Man's Switch بيعمل نفس الحاجة مع الـ cron. خلّي المهمة تبعت نبضة بعد ما تخلص بنجاح. خدمة خارجية بتستنى النبضة دي. لو اتأخرت عن معادها، الخدمة تبعتلك تنبيه على طول.
تعريف Dead Man's Switch بدقة
الـ Dead Man's Switch هو آلية بتتفعّل تلقائيًا لما يغيب فعل بشري أو إشارة كان مفروض تيجي في وقت معروف. في المراقبة بنسميه برضه heartbeat monitoring: المهمة بتبعت نبضة دورية، والمراقب بيطلق إنذار لو النبضة فاتت نافذتها الزمنية.
الافتراض هنا إن عندك جدول ثابت ومعروف، زي كل ساعة أو كل يوم 3 الفجر. من غير جدول متوقّع، مفيش معنى لكلمة "اتأخر".
اعملها بنفسك في 4 خطوات
- افتح حساب مجاني على healthchecks.io واعمل Check جديد وحدّد جدوله. هياخد منك UUID خاص بالمهمة.
- غلّف مهمتك بسكربت بسيط يبعت نبضة بعد التنفيذ، وكمان يبلّغ بكود الفشل لو حصل.
- حط السكربت في الـ crontab بدل الأمر الأصلي.
- اقطع المهمة عمدًا مرة واحدة، واتأكد إن التنبيه وصلك فعلاً.
#!/usr/bin/env bash
# backup-monitored.sh
URL="https://hc-ping.com/your-uuid-here"
# 1) نبضة "بدأت" عشان نقيس مدة التنفيذ كمان
curl -fsS -m 10 --retry 3 "$URL/start" > /dev/null
# 2) نفّذ المهمة الحقيقية واحفظ كود الخروج
/opt/scripts/backup.sh
EXIT=$?
# 3) ابعت النتيجة: 0 معناها نجاح، أي رقم تاني معناه فشل
curl -fsS -m 10 --retry 3 "$URL/$EXIT" > /dev/null
وسطر الـ crontab يبقى:
0 3 * * * /opt/scripts/backup-monitored.shركز في --retry 3 و-m 10. لو الشبكة لخبطت لحظة إرسال النبضة، مايتحسبش فشل كذب. وبما إننا بنبعت $EXIT، لو الباكب نفسه رجع كود غير صفر، الخدمة هتعتبرها فشل وتنبّهك فورًا بدل ما تفتكر إنها نجحت.
الأرقام: قبل وبعد
الافتراض: نسخة احتياطية يومية على سيرفر واحد. من غير مراقبة، اكتشاف فشل الـ cron بيعتمد على الصدفة، وممكن ياخد أيام. مع heartbeat بجدول يومي و grace period ساعة، التنبيه بيوصلك خلال أقل من 5 دقائق من فوات النافذة.
الباقة المجانية في healthchecks.io بتديك 20 check وقنوات تنبيه زي الإيميل و Slack و Webhook بصفر تكلفة. يعني تغطية أهم مهامك من غير ما تدفع جنيه.
الـ trade-offs
بتكسب: كشف الصمت، اللي هو أصعب نوع فشل تلاقيه بنفسك. وبتكسب قياس مدة التنفيذ ببلاش من نبضة الـ start.
بتخسر: اعتماد على طرف ثالث، وإن السيرفر لازم يقدر يطلع نت بره عشان يبعت النبضة. لو ده مرفوض عندك، الـ trade-off إن Healthchecks.io نفسه مفتوح المصدر وتقدر تستضيفه بنفسك بـ Docker وتشيل الاعتماد الخارجي.
متى لا تستخدم هذه الطريقة
متستخدمهاش لو المهمة مالهاش جدول ثابت، زي job بيشتغل بس لما حدث معين يحصل. النمط ده كله مبني على فكرة "الميعاد المتوقع".
وكمان لو السيرفر معزول تمامًا عن الإنترنت لأسباب أمنية، استخدم بديل داخلي زي Prometheus Pushgateway مع Alertmanager بدل خدمة سحابية.
المصادر
- توثيق Healthchecks.io الرسمي — إشارات النجاح والفشل و grace time: healthchecks.io/docs
- Cronitor — مفهوم heartbeat monitoring للمهام المجدولة: cronitor.io/guides
- صفحة Dead man's switch على Wikipedia — أصل المصطلح ومنطقه.
- دليل curl الرسمي — خيارات --retry و -m / --max-time: curl.se/docs/manpage.html
الخطوة التالية
اختار أهم مهمة مجدولة عندك دلوقتي، غالبًا الباكب. غلّفها بالسكربت اللي فوق، وبعدين عطّلها عمدًا مرة واحدة. لو التنبيه وصلك خلال دقايق، يبقى شبكة الأمان اشتغلت. لو ماوصلش، راجع إعداد الـ grace time والقناة قبل ما تعتمد عليها.