صيغة كرون تاب باختصار
تعبير الكرون خمسة حقول تفصل بينها مسافات. وفي ملف كرون تاب يأتي الأمر بعدها على السطر نفسه:
MIN HOUR DOM MON DOW COMMAND
30 2 * * 1-5 /usr/local/bin/backup.sh
│ │ │ │ │
│ │ │ │ └──── يوم الأسبوع: من الإثنين إلى الجمعة
│ │ │ └───────── الشهر: كل الأشهر
│ │ └────────────── يوم الشهر: كل الأيام
│ └──────────────────── الساعة: 2 صباحًا
└───────────────────────── الدقيقة: 30
ويُقرأ هكذا: «الساعة 2:30 صباحًا، من الإثنين إلى الجمعة».
| # | الحقل | القيم المسموحة | ملاحظات |
|---|---|---|---|
| 1 | الدقيقة | 0–59 | — |
| 2 | الساعة | 0–23 | بنظام 24 ساعة، ومنتصف الليل هو 0 وليس 24 |
| 3 | يوم الشهر | 1–31 | الأيام غير الموجودة في الشهر يتم تخطيها |
| 4 | الشهر | 1–12 أو JAN–DEC | الأسماء لا تتأثر بحالة الأحرف |
| 5 | يوم الأسبوع | 0–7 أو SUN–SAT | 0 و7 كلاهما يعني الأحد |
الأسماء هي أول ثلاثة أحرف من اسم الشهر أو اليوم بالإنجليزية. تعمل الأرقام في كل إصدارات الكرون، وبعض الوثائق القديمة تذكر أن النطاقات والقوائم بالأسماء (مثل MON-FRI) غير مسموحة، لذلك فإن 1-5 هو الخيار الأضمن.
رموز الكرون
| الرمز | المعنى | مثال | يعمل |
|---|---|---|---|
* | كل القيم | * * * * * | كل دقيقة |
, | قائمة قيم | 0 9,17 * * * | الساعة 9 صباحًا و5 مساءً |
- | نطاق يشمل طرفيه | 0 9-17 * * * | كل ساعة من 9 صباحًا إلى 5 مساءً |
/ | خطوة تكرار | */15 * * * * | كل 15 دقيقة |
a-b/n | خطوة داخل نطاق | 0 8-18/2 * * * | كل ساعتين من 8 صباحًا إلى 6 مساءً |
ويمكن الجمع بين الرموز: 0,30 9-17 * * 1-5 يعمل كل نصف ساعة من 9 صباحًا حتى 5:30 مساءً في أيام العمل.
خطوة التكرار تبدأ من جديد مع كل نطاق
*/7 في حقل الدقائق يعمل عند 0 و7 و14 … 56 ثم عند 0 مرة أخرى، لذلك يكون الفاصل عند نهاية الساعة 4 دقائق لا 7. وللحصول على إيقاع منتظم استخدم خطوة تقبل القسمة على 60 للدقائق (2، 3، 4، 5، 6، 10، 12، 15، 20، 30) أو على 24 للساعات (2، 3، 4، 6، 8، 12).
وللسبب نفسه لا يعني */90 «كل 90 دقيقة»، فحسب الإصدار إما أن يُرفض أو يُعامل بصمت على أنه الدقيقة 0 فقط. ولتشغيل مهمة كل 90 دقيقة استخدم سطرين:
0 0-21/3 * * * /usr/local/bin/job.sh
30 1-22/3 * * * /usr/local/bin/job.sh
الاختصارات الخاصة
| الاختصار | يساوي | يعمل |
|---|---|---|
@yearly @annually | 0 0 1 1 * | مرة في السنة، في 1 يناير عند منتصف الليل |
@monthly | 0 0 1 * * | في اليوم الأول من كل شهر عند منتصف الليل |
@weekly | 0 0 * * 0 | كل يوم أحد عند منتصف الليل |
@daily @midnight | 0 0 * * * | كل يوم عند منتصف الليل |
@hourly | 0 * * * * | في بداية كل ساعة |
@reboot | — | مرة واحدة عند بدء cron بعد الإقلاع |
يقبل كرون لينكس (Vixie cron وcronie) كل هذه الاختصارات، ويقبلها Kubernetes كلها ما عدا @reboot. أما المجدولات الأخرى فقد لا تقبلها، فتحقّق قبل الاعتماد عليها.
يوم الشهر ويوم الأسبوع: قاعدة «أو»
إذا كان حقلا اليوم مقيّدين معًا، يشغّل كرون لينكس المهمة عند تطابق أيٍّ منهما. فالتعبير 0 9 1 * 1 يعمل الساعة 9 صباحًا في اليوم الأول من كل شهر وأيضًا كل يوم إثنين، وليس فقط أيام الإثنين التي توافق اليوم الأول. وإذا كان أحد الحقلين * فالحقل الآخر وحده هو المعتمد.
وللحصول على منطق «و»، جدول الشرط الأوسع واختبر الشرط الآخر داخل الأمر. فأول إثنين في الشهر مثلًا هو يوم الإثنين الذي يقع بين اليوم 1 واليوم 7:
0 9 * * 1 [ "$(date +\%d)" -le 7 ] && /usr/local/bin/monthly-report.sh
أما Quartz وAWS وSalesforce فتتجنب المشكلة بطريقة أخرى: إذ تشترط وضع ? في أحد حقلي اليوم.
قيم تبدو صحيحة لكنها ليست كذلك
0 0 30 2 *لن يعمل أبدًا، فلا يوجد 30 فبراير.0 0 31 * *يعمل فقط في الأشهر السبعة التي فيها 31 يومًا. ولآخر يوم في كل شهر استخدم هذا الحل.0 24 * * *غير صحيح، فمنتصف الليل هو الساعة0.- لا يوجد حقل للثواني في كرون لينكس، وأصغر فاصل هو دقيقة واحدة (راجع كيف تشغّل مهمة كل 30 ثانية).
- المواعيد تتبع المنطقة الزمنية للخادم لا منطقتك، والخوادم السحابية تعمل غالبًا بتوقيت UTC.
صيغة الكرون في المنصات الأخرى
تستعير مجدولات كثيرة صيغة الكرون وتضيف إليها. ومعاني الرموز الإضافية: ? بلا قيمة محددة، وL الأخير، وW أقرب يوم عمل، و# ترتيب اليوم في الشهر، وH قيمة يشتقها Jenkins من اسم المهمة.
| المنصة | عدد الحقول | رموز إضافية |
|---|---|---|
| كرون لينكس (crontab) | 5 | — |
| Quartz | 6–7 | ? L W # |
| Spring | 6 | ? L W # |
| AWS EventBridge | 6 | ? L W # |
| Jenkins | 5 | H |
| Salesforce | 6–7 | ? L W # |
| Hangfire | 5–6 | ? L W # |
| Airflow | 5 | ? L W # |
| node-cron | 5–6 | ? L W # |
أمثلة على صيغة الكرون
| تعبير الكرون | الجدول الزمني |
|---|---|
* * * * * | كل دقيقة. |
*/5 * * * * | كل 5 دقائق. |
*/15 * * * * | كل 15 دقيقة. |
0 * * * * | عند الدقيقة 0 من كل ساعة. |
0 */6 * * * | عند الدقيقة 0 من كل ساعة، كل 6 ساعات. |
0 0 * * * | في تمام الساعة 12:00 ص. |
0 2 * * * | في تمام الساعة 2:00 ص. |
0 9 * * 1-5 | في تمام الساعة 9:00 ص، من الإثنين إلى الجمعة. |
0 0 * * 0 | في تمام الساعة 12:00 ص، يوم الأحد فقط. |
0 0 1 * * | في تمام الساعة 12:00 ص، في اليوم 1 من الشهر. |
0 0 1 */3 * | في تمام الساعة 12:00 ص، في اليوم 1 من الشهر، في أشهر يناير، أبريل، يوليو وأكتوبر فقط. |
0 0 1 1 * | في تمام الساعة 12:00 ص، في اليوم 1 من الشهر، في شهر يناير فقط. |
تصفّح كل أمثلة تعبيرات الكرون، أو أنشئ تعبيرك باستخدام مولد تعبيرات الكرون.
الأسئلة الشائعة
ما هي صيغة الكرون الصحيحة؟
خمسة حقول تفصل بينها مسافات (الدقيقة، الساعة، يوم الشهر، الشهر، يوم الأسبوع) يليها الأمر في ملف كرون تاب: */10 * * * * /path/to/script.sh. ويقبل كل حقل رقمًا أو * أو قائمة (1,15) أو نطاقًا (1-5) أو خطوة (*/10).
كم عدد حقول تعبير الكرون؟
خمسة في كرون لينكس. يضيف Quartz وSpring وSalesforce حقلًا للثواني في البداية (ويسمح Quartz وSalesforce أيضًا بحقل اختياري للسنة في النهاية)، أما AWS EventBridge ففيه ستة حقول آخرها السنة.
ماذا تعني النجمة في الكرون؟
«كل القيم». فوجود * في حقل الساعة يعني كل ساعة، والتعبير * * * * * يعمل كل دقيقة.
هل صيغة الكرون واحدة في كل مكان؟
لا. الحقول الخمسة الأساسية مشتركة على نطاق واسع، لكن Quartz وSalesforce يعدّان الأحد 1، ويحتاج AWS إلى حقل السنة والرمز ?، ويضيف Jenkins الرمز H، ويقبل Hangfire وnode-cron حقل ثوانٍ اختياريًا. استخدم المولد الخاص بمنصتك لتلتزم بقواعدها.
هل يمكنني استخدام أسماء مثل MON أو JAN؟
نعم، في حقلي الشهر ويوم الأسبوع: من JAN إلى DEC ومن SUN إلى SAT، بأي حالة أحرف. أما في النطاقات فالأرقام مثل 1-5 هي الخيار الأضمن.
كيف أشغّل مهمة كرون كل 90 دقيقة؟
لا يمكن ذلك بتعبير واحد، لأن خطوة التكرار تبدأ من جديد كل ساعة. استخدم سطرين: 0 0-21/3 * * * و30 1-22/3 * * *، فيعملان معًا عند 0:00 و1:30 و3:00 و4:30 وهكذا.
هل يدعم الكرون الثواني؟
ليس في كرون تاب لينكس، فأصغر وحدة فيه هي الدقيقة. لكن مجدولات مثل Spring وQuartz وnode-cron تضيف حقلًا للثواني، فيعمل */30 * * * * * كل 30 ثانية فيها.