المستوى: مبتدئ
لو عندك cron job بيعمل backup للقاعدة كل ساعة، وفجأة اكتشفت إن آخر backup ناجح كان من 6 أيام بدون لا log ولا تنبيه، انت مش لوحدك. cron بيشتغل صامت وبيفشل أصمت. systemd timers بيحل المشكلة دي في 8 أسطر، مع logs مركزية في journald و retry تلقائي للمهام اللي فاتت وقت reboot.
systemd Timers: بديل cron اللي بيتكلم لما المهمة بتفشل
المشكلة باختصار
cron بيشغّل سكربتك في وقت محدد. تمام. لكن لو السكربت فشل، cron مش هيقولك. لو السيرفر كان مطفي وقت التشغيل، cron مش هيعوّض المهمة الفاتت. ولو السكربت طوّل أكتر من المتوقع، cron هيشغّل نسخة تانية فوقها على طول. النتيجة: مهام بتفشل بدون ما حد يدري، أو بتشتغل مرتين، أو بتفوت نهائي.
الناس بتعالج ده بسكربتات wrapper بتبعت email لما الـ exit code مش zero. الـ email بيتبعت لـ root user محلي، وغالبًا الـ mailbox ده محدش بيقرأه. النتيجة: نفس المشكلة، طبقة كذب جديدة فوقها.
مثال واقعي بسيط — قبل ما نشرح المفهوم
تخيل إنك طلبت من صاحبك إنه يفكّرك كل يوم تشرب 8 أكواب ميه. عندك خياران:
- صاحب على طريقة cron: بيندهلك الساعة 8 الصبح "اشرب ميه". لو كنت نايم، بيمشي وميقولكش تاني. لو رديت "أنا مشغول"، بيتجاهلك ويبدأ كلام جديد عن حاجة تانية. لو فعلاً نسيت تشرب الميه، محدش هيعرف غير لما تيجي تفتح التلاجة وتلاقي الـ 8 أكواب زي ما هما.
- صاحب على طريقة systemd timer: بيندهلك الساعة 8 الصبح. لو كنت نايم بيستنى ويفكّرك أول ما تقوم. لو رديت "أنا مشغول"، بيستناك تخلص. ولو فشلت في الشرب، بيكتب في دفتر: "اليوم 24/5، الكوب الرابع متشرابش". الدفتر ده تقدر تفتحه أي وقت وتعرف المشكلة كانت في إيه بالظبط.
الفرق مش في الفكرة (التذكير). الفرق في إن واحد بيعترف بالواقع، والتاني بيمثّل إن كله تمام.
الشرح العلمي للفرق
cron هو daemon قديم اتعمل سنة 1975 على Unix V7. بيقرأ ملف crontab وبيشغّل أوامر في أوقات محددة بـ syntax مكوّن من 5 خانات (دقيقة، ساعة، يوم، شهر، يوم أسبوع). مفيش عنده concept للـ logs المركزية، ولا dependencies، ولا retry، ولا notifications. لو السكربت كتب على stderr، الناتج بيتبعت كـ email لمستخدم الـ owner — وفي 90% من السيرفرات الحديثة، الـ MTA مش معمول له forwarding أصلاً.
systemd timer هو unit من نظام systemd، اللي ظهر سنة 2010 وبقى الـ init system الافتراضي على Ubuntu 16+، RHEL 7+، Debian 8+، Arch، Fedora، و SUSE. كل timer مربوط بـ service unit. الـ service بيتشغّل، الـ stdout والـ stderr بيتسجّلوا في journald (الـ log daemon الموحّد بتاع systemd)، والـ dependencies والـ retries والـ resource limits بتتدار من systemd مباشرة.
الفرق العملي: cron بيشغّل وينسى. systemd بيشغّل، بيراقب، بيسجّل، بيعيد لو لزم، وبيوفّر API موحّد لكل أدوات الـ observability.
مثال شغّال — backup كل ساعة في 8 أسطر
هنعمل backup للقاعدة كل ساعة. تلات خطوات بس:
- اعمل service unit بيعرّف الأمر اللي هيشتغل.