صندوق systemd تملكه → مؤقت. وظائف من سطر واحد، حاويات، صناديق لم تبنيها → cron.
Cron يفشل بصمت — يرسل بريداً إلى صندوق محلي لا أحد يقرأه. المؤقتات تسجل كل تشغيل في journal: journalctl -u mytimer.service.
Persistent=true يعيد تشغيل المهام التي فاتت أثناء إطفاء الجهاز ؛ cron يتخطاها بصمت.
المهمة نفسها — نسخ احتياطي ليلي في 03:30 — على الساعتين، وما يخلف كل واحدة وراءها:
CRON · سطر واحد
30 3 * * * /usr/local/bin/backup.sh
يعمل عندما تتطابق ساعة الحائط. إن فشل، يذهب الخرج بريداً إلى صندوق محلي — غير مقروء غالباً. كانت الآلة مطفأة في 03:30؟ مُتخطاة، بصمت.
هل اشتغل أصلاً؟ journalctl -u cron -n 20 أو grep CRON /var/log/syslog
مؤقت SYSTEMD · ملفا وحدة
# foo.timer
[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true
# foo.service — the job itself
وحدة من الدرجة الأولى: حالة واعتماديات وسجلات لكل تشغيل في journal. كانت الآلة نائمة في الساعة المحددة؟ Persistent=true يجريها مرة عند الإقلاع.
تحقق: systemd-analyze calendar "*-*-* 03:30:00" — التشغيل القادم، قبل أن تحفظ
حكم الجدولة: خمسة حقول cron هي الـ incumbent المكثّف؛ OnCalendar أطول لفظاً لكنه أعلى تعبيراً قطعاً — Mon..Fri 09..17:00:00 من سطر واحد، وRandomizedDelaySec يمنع ألف جهاز من مطرقة خادم واحد
هذه الساعتان تحدّدان التوقيت من أوامر السجل ذاتها — لا تقدران على قراءة journal جهازك؛ أين journal فعلياً: القسمان 04 و05.
Persistent=true يجري مرة عند الإقلاع إذا فاتته جدولته؛ cron يتخطاها ببساطة.network-online.target أو نقاط التحميل؛ cron يوجب عليك بناء منطق إعادة المحاولة بيديك داخل السكربت.OnBootSec=15min — تغيّرات ساعة الحائط لا تربكه.ثلاثة أوامر تجيب عن كل شيء — اعرض ما هو مبرمج ومتى سيشتعل في المرة القادمة، شغّل المهمة بيديك كما سيشغلها المؤقت تماماً، ثم اقرأ سجلاته:
systemctl list-timers --all # every timer, next + last run
sudo systemctl start backup.service # fire the job now, same unit as the timer
journalctl -u backup.service -f # watch its output live
انتبه للانفصال: systemctl start backup.timer تسلح الجدولة؛ service هي المهمة. إذا list-timers أظهر مؤقتك، systemctl status backup.service أخضر، والسجل يظهر مخرجك — فالسلسلة كلها تعمل.
verify: systemctl list-timers --all → مؤقتك، آخر + تشغيل قادم مُسرَدان
مهام cron تعمل ببيئة مجرّدة، ولهذا فـ «يعمل في شلّي، يفشل في cron» جنس قائم بذاته من الباغات. لإعادة إنتاج cron بصدق، شغّل الأمر عبر sh بالبيئة التي سيستخدمها cron:
crontab -l # confirm the exact line
env -i SHELL=/bin/sh PATH=/usr/bin:/bin sh -c '/usr/local/bin/backup.sh'
grep CRON /var/log/syslog | tail # did cron even fire it? (Debian/Ubuntu)
journalctl -u cron -n 20 # same, on systemd distros
ذلك الـ env -i سطراً هو الاختبار اليدوي الأمين: بيئة عارية مع افتراضي cron وهو PATH. كلاسيكيتا cron الاثنتان — الـ PATH العارية، والـ % غير المقتبسة (يعتبرها cron فاصلة سطر) — كلتاهما تظهران فوراً في هذا الاختبار.
verify: journalctl -u cron -n 20 → سطر CRON لأمرك
المؤقت الذي يبدي ميتاً هي عادةً خدمته تفشل فوراً. أربعة أسباب، بترتيب الفحص:
foo.timer تُشعل foo.service — خطأ مطبعي أو وحدة أُعيدت تسميتها، والمؤقت «يشتغل» في الفراغ. systemctl cat foo.timer يظهر بدقة ما يستهدفه.sudo systemctl daemon-reload && sudo systemctl restart foo.timer. بغير ذلك جدولتك الجديدة ليست حية.systemctl status foo.timer يظهر دائماً active حتى وهو ساكن — اقرأ list-timers بدلاً منه.journalctl -u foo.service --since -1h يُظهر الانهيار الذي list-timers يحجبه.verify: journalctl -u foo.service --since -1h → الانهيار الذي يحجبه list-timers
| cron | مؤقت systemd | |
|---|---|---|
| التنصيب | سطر crontab واحد | ملفا وحدة |
| التسجيل | بريد محلي، غير مقروء غالباً | journal، لكل وحدة |
| تشغيل فائت (الآلة مطفأة) | مُتخطى | يجري مرة بـ Persistent=true |
| الاعتماديات / الترتيب | لا شيء — بيديك في السكربت | اعتماديات وحدات كاملة |
| تأخير عشوائي | بيديك عبر $RANDOM | RandomizedDelaySec= |
| اختبار / dry-run للجدولة | لا | systemd-analyze calendar |
| موجود في كل مكان | نعم — حاويات، BSD، مدمج | يحتاج systemd (PID 1) |
| مهام مستخدم من دون root | crontab -e | systemd --user وحدات |
قواعد الإبهام : تسليم مهمة على جهازك ذي systemd → مؤقت. تذكير شخصي سريع أو صندوق لم تبنيه → cron. أي ذو اعتماديات أو إعادات محاولة أو حاجة لمعرفة هل اشتغل فعلاً → مؤقت، دائماً. النمط الكلاسيكي — نسخ احتياطي ليلي بـ rsync تحت مؤقت مع Persistent=true — يضمن حدوث النسخ حتى لو كانت الآلة نائمة في الدقيقة المحددة، وهو ما لا يقدمه cron إطلاقاً.
نهاية الساعتين · لم يُجلب شيء · كل شيء محلي