خبير Crontab

الصق تعبير cron واحصل على شرح حقلًا بحقل، بالإنجليزية الواضحة، لما يفعله. لا حاجة لتذكر ترتيب الحقول أو البحث عن النطاقات: يمر الخبير على كل حقل من الحقول الخمسة (الدقيقة والساعة ويوم الشهر والشهر ويوم الأسبوع) ويقرأ التعبير من اليسار إلى اليمين. مفيد للتحقق من سطر crontab قبل نشره أو لشرح سطر ورثته.

كيفية استخدام الخبير

  1. 1

    الصق التعبير

    انسخ أي تعبير cron قياسي من 5 حقول (مثل `0 9 * * 1-5`) في حقل الإدخال.

  2. 2

    اطلب الشرح

    انقر Explain Cron ليعيد لك الأداة وصفًا سطرًا بسطر لكل حقل: الدقيقة والساعة ويوم الشهر والشهر ويوم الأسبوع.

  3. 3

    اقرأ الوصف

    يُولَّد الشرح بالإنجليزية، على سبيل المثال "Minute: every 5 minutes" أو "Hour: from 9 through 17."

  4. 4

    تحقق قبل النشر

    استخدم الشرح للتأكد من أن الجدول الزمني يفعل ما تريد قبل وضعه في crontab أو إعدادات CI أو ملف Kubernetes manifest.

ورقة الحقول المرجعية

 ┌───────────── الدقيقة (0-59)
 │ ┌─────────── الساعة (0-23)
 │ │ ┌───────── يوم الشهر (1-31)
 │ │ │ ┌─────── الشهر (1-12 أو JAN-DEC)
 │ │ │ │ ┌───── يوم الأسبوع (0-6 أو SUN-SAT؛ الأحد = 0 أو 7)
 │ │ │ │ │
 * * * * *

العوامل في تعبيرات cron

العامل المعنى مثال
* كل قيمة * * * * *
, قائمة قيم 0,15,30,45
- نطاق 9-17
/ خطوة (بداية/خطوة) */5، 0-30/5
L الأخير (آخر يوم في الشهر أو آخر يوم أسبوعي مطابق، Quartz) L، 5L
W أقرب يوم عمل 15W (Quartz)
# اليوم الأسبوعي المطابق رقم N في الشهر 1#3 (Quartz)
? لا قيمة محددة فقط Quartz

ترتيب القراءة مهم

يُقرأ 0 */2 * * 1-5 من اليسار إلى اليمين على النحو التالي: الدقيقة 0، كل ساعتين، أي يوم في الشهر، أي شهر، من الاثنين إلى الجمعة. أحيانًا يقرأ الناس الحقول من اليمين إلى اليسار بدافع العادة فيلتبس عليهم الأمر؛ ابدأ دائمًا بالدقيقة.

فخ “كل X دقيقة”

يُشغَّل */10 * * * * في الدقائق 0 و10 و20 و30 و40 و50، وليس “كل 10 دقائق منذ إنشاء المهمة”. تُقاس خطوات cron دائمًا من بداية نطاق الحقل. إذا نشرت مهمة في 12:03، فسيكون أول تشغيل في 12:10 وليس 12:13.

بالنسبة للمهام التي تحتاج فعلًا إلى “N دقيقة بعد آخر تشغيل”، استخدم جدولة بمؤقت دائم (مؤقتات systemd مع OnUnitActiveSec أو جدولة على مستوى التطبيق مع تخزين طابع وقت آخر تشغيل).

مزالق cron الجديرة بالمعرفة

  • تعيين يوم الشهر ويوم الأسبوع معًا: معظم تطبيقات cron تعامل ذلك كسلوك OR، وربما لا يكون ما تريده.
  • خطوة 0: */0 غير صالح.
  • نطاق يلتف حول منتصف الليل: 22-2 للساعات لا يعمل في cron التقليدي؛ استخدم 22-23,0-2.
  • 30 فبراير: جدول مثل 0 0 30 2 * لا يُشغَّل أبدًا.
  • غموض التوقيت الصيفي (DST): المهام المجدولة بين 2 و3 صباحًا قد تُشغَّل مرتين أو لا تُشغَّل إطلاقًا في أيام الانتقال إلى التوقيت الصيفي.

cron مقابل أدوات الجدولة الحديثة

ما زال cron في يونكس مستخدمًا في كل مكان، لكن لأي شيء حساس فستريد غالبًا أحد هذه الخيارات:

  • مؤقتات systemd: تلتقط التشغيلات الفائتة، وتدعم الإزاحات العشوائية، وتقرأ من ملفات الوحدات.
  • Kubernetes CronJob: تصريحي، مع إعادة المحاولة، ويدرك المنطقة الزمنية في 1.25+.
  • Airflow / Prefect / Dagster: للمهام ذات الاعتماديات وإعادة المحاولة والبيانات الرجعية والمراقبة.
  • جدولة GitHub Actions: cron من 5 حقول، بتوقيت UTC فقط، بفاصل زمني أدنى 5 دقائق، مع تسليم بأفضل جهد.

cron في حد ذاته تنسيق رائع، لكنه أداة جدولة ضعيفة للمهام التي لا يجوز تفويتها.

الأسئلة الشائعة

لأن يوم الأسبوع 0 هو الأحد في cron القياسي (و7 أيضًا يوم الأحد، ما يدعم الصيغتين). الاثنين هو 1. أما Quartz فترقّم أيام الأسبوع من 1 إلى 7 بحيث يكون الأحد = 1، وهذا كثيرًا ما يُربك من ينتقل بين الصيغ.

يعمل cron التقليدي في يونكس بالمنطقة الزمنية المحلية للخادم، أي ما يقوله /etc/timezone. أما Kubernetes CronJob وGitHub Actions ومعظم أدوات الجدولة السحابية فتعمل بتوقيت UTC افتراضيًا. تحقق دائمًا، واستخدم UTC كلما أمكن لتجنب مفاجآت التوقيت الصيفي.

لا يستطيع cron التقليدي التعبير عن ذلك مباشرة. الحل البديل: شغّل المهمة كل اثنين وتحقق من التاريخ داخل السكربت: [ $(date +%d) -le 7 ] && ./job.sh. أما Quartz فتدعم ذلك أصليًا عبر 1#1.

لا. يحتاج كل جدول إلى سطر خاص به. لكن يمكنك دمج عدة جداول في سطر واحد باستخدام القوائم: 0 9,17 * * * يعمل في 9 و17. أما الجداول التي لا يمكن التعبير عنها في سطر واحد فأضف لها عدة أسطر تشير إلى الأمر نفسه.

أدوات ذات صلة

الأداة متاحة بلغات أخرى