المستوى: مبتدئ — لأي حد بيشغّل 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 يبقى: