شرح تعابير cron
تعبير cron سلسلة من خمسة حقول — الدقيقة والساعة ويوم الشهر والشهر ويوم الأسبوع — تخبر المجدوِل بموعد تشغيل مهمة. تعتمد الصياغة نفسها في crontab على لينكس، وCronJobs في Kubernetes، وجدولات GitHub Actions، ومشغّلات cron في Cloudflare Workers، ومعظم أنظمة CI، وتُبنى عليها صيغ بستة حقول مثل Quartz وAWS EventBridge، لذا فإن قراءتها وكتابتها مهارة تستخدمها في كل مكان.
يستعرض هذا الدليل كل حقل ومعامل، ويقدّم الجدولات التي يبحث عنها الناس أكثر، ويشرح الفخاخ — المناطق الزمنية، ويوم الشهر مقابل يوم الأسبوع، وحقل الثواني الإضافي في بعض الأنظمة — التي تجعل المهمة تعمل في الوقت الخطأ أو لا تعمل أصلاً.
الحقول الخمسة
تُقرأ الحقول من اليسار إلى اليمين كما في الشكل أدناه: الدقيقة (0–59)، ثم الساعة (0–23)، ثم يوم الشهر (1–31)، ثم الشهر (1–12 أو JAN–DEC)، ثم يوم الأسبوع (0–6 والأحد هو 0، أو SUN–SAT).
- * * * * * — كل دقيقة.
- 30 2 * * * — الساعة 02:30 كل يوم.
- 0 9 * * 1-5 — الساعة 09:00 من الاثنين إلى الجمعة.
* فتترك حقلها بلا تقييد.الساعة 09:00 من الاثنين إلى الجمعة
الجزء 1:0
الساعة 02:30 كل يوم
الجزء 1:30
كل دقيقة
الجزء 1:*
- 1الدقيقةالقيم المسموحة:
0–590: عند الدقيقة 0 - 2الساعةالقيم المسموحة:
0–239: عند الساعة 9 - 3يوم الشهرالقيم المسموحة:
1–31*: أي يوم من الشهر - 4الشهرالقيم المسموحة:
1–12أوJAN–DEC*: أي شهر - 5يوم الأسبوعالقيم المسموحة:
0–6أوSUN–SAT؛ والأحد هو 0، وتقبل معظم التطبيقات 7 أيضاً1-5: من الاثنين إلى الجمعة
عندما يكون حقلا اليوم مقيّدين معاً، يشغّل cron القياسي المهمة إذا تطابق أحدهما (OR)؛ راجع «يوم الشهر مقابل يوم الأسبوع».
النسخة النصية
┌───────────── minute (0–59)
│ ┌─────────── hour (0–23)
│ │ ┌───────── day of month (1–31)
│ │ │ ┌─────── month (1–12 or JAN–DEC)
│ │ │ │ ┌───── day of week (0–6, Sunday = 0, or SUN–SAT)
│ │ │ │ │
* * * * * → every minute
30 2 * * * → at 02:30 every day
0 9 * * 1-5 → at 09:00 Monday to Fridayالمعاملات: * و/ و- و,
- * (النجمة) — كل قيمة. * في حقل الساعة تعني كل ساعة.
- , (الفاصلة) — قائمة. 0,30 في حقل الدقيقة تعني عند الدقيقة 0 والدقيقة 30.
- - (الشرطة) — نطاق. 9-17 في حقل الساعة تعني 9 و10 و… و17.
- / (الشرطة المائلة) — خطوة. */15 في حقل الدقيقة تعني كل 15 دقيقة (0 و15 و30 و45). أما في حقل يوم الشهر فتعني 1-31/2 (أو */2) الأيام الفردية من الشهر — 1 و3 و5 … و31 — فالمهمة التي تعمل يوم 31 تعمل مجدداً يوم 1 من الشهر التالي؛ أي أنها ليست «كل يومين» بفاصل ثابت.
- الأسماء — تُقبل JAN–DEC وSUN–SAT في معظم التطبيقات وهي أسهل في القراءة من الأرقام.
- الامتدادات — تقبل بعض المجدوِلات L (الأخير) وW (أقرب يوم عمل) و# (اليوم الأسبوعي رقم n) و? — وهذه ميزات Quartz/Spring لا cron القياسي.
جدولات شائعة
- */5 * * * * — كل 5 دقائق.
- 0 * * * * — كل ساعة عند بدايتها.
- 0 */6 * * * — كل 6 ساعات (00:00 و06:00 و12:00 و18:00).
- 0 0 * * * — كل يوم عند منتصف الليل.
- 0 9 * * 1-5 — من الاثنين إلى الجمعة الساعة 09:00.
- 0 9 * * 1 — كل يوم اثنين الساعة 09:00.
- 0 0 1 * * — أول يوم من كل شهر عند منتصف الليل.
- 0 0 1 1 * — مرة في السنة، في 1 يناير.
- 30 23 * * 0 — أيام الأحد الساعة 23:30.
- 0 8,20 * * * — مرتين يومياً، 08:00 و20:00.
- 15 3 */2 * * — الأيام الفردية من الشهر الساعة 03:15.
- 0 0 * * 5 — كل يوم جمعة عند منتصف الليل.
*/5 * * * * every 5 minutes
0 * * * * every hour, on the hour
0 */6 * * * every 6 hours (00:00, 06:00, 12:00, 18:00)
0 0 * * * every day at midnight
0 9 * * 1-5 weekdays at 09:00
0 9 * * 1 every Monday at 09:00
0 0 1 * * first day of every month at midnight
0 0 1 1 * once a year, 1 January
30 23 * * 0 Sundays at 23:30
0 8,20 * * * twice a day, 08:00 and 20:00
15 3 */2 * * odd-numbered days of the month at 03:15
0 0 * * 5 every Friday at midnightالمناطق الزمنية: أكثر أخطاء cron شيوعاً
ليس لتعبير cron منطقة زمنية خاصة به؛ فهو يعمل في المنطقة التي يستخدمها المجدوِل. يستخدم crontab في لينكس منطقة النظام، وتستخدم Cloudflare Workers التوقيت العالمي UTC، وكذلك GitHub Actions ما لم تحدّد الجدولة منطقة زمنية (timezone)، أما CronJob في Kubernetes فيعمل بالمنطقة المحلية لـ kube-controller-manager (وهي UTC غالباً في العناقيد المُدارة) ما لم يُضبط الحقل .spec.timeZone، وتختلف الخدمات السحابية. المهمة المقصود تشغيلها الساعة 09:00 بتوقيت الرياض (UTC+3) يجب أن تُكتب 0 6 * * * على مجدوِل بتوقيت UTC — والساعة 09:00 في منطقة تطبّق التوقيت الصيفي تنزاح ساعة مرتين في السنة. وثّق المنطقة الزمنية دائماً بجوار التعبير وحوّل صراحةً.
يوم الشهر مقابل يوم الأسبوع
عندما يكون حقلا اليوم مقيّدين معاً، يشغّل cron القياسي المهمة إذا تطابق أحدهما (OR) لا كلاهما. يعمل 0 0 13 * 5 في كل يوم 13 وفي كل يوم جمعة، لا في يوم الجمعة الموافق 13 فقط. وللتعبير عن «ثاني ثلاثاء في الشهر» أو «آخر يوم في الشهر» تحتاج إلى امتدادات على طريقة Quartz أو فحص صغير داخل المهمة نفسها.
cron بستة حقول ونسخ أخرى
- تضع Quartz وSpring وبعض مجدوِلات Java حقل الثواني أولاً: 0 */5 * * * ? — ستة أو سبعة حقول. لصق تعبير من خمسة حقول هناك يزيح كل حقل بمقدار واحد.
- تستخدم القواعد المجدولة في AWS EventBridge ستة حقول — الدقيقة والساعة ويوم الشهر والشهر ويوم الأسبوع وحقلاً للسنة — وتشترط ? في أحد حقلي اليوم، ويُعدّ فيها يوم الأسبوع من 1 إلى 7 بدءاً من الأحد: cron(0 9 ? * MON-FRI *). ويُرفض فيها التعبير ذو الحقول الخمسة.
- تستخدم Cloudflare Workers وKubernetes وGitHub Actions وVercel الحقول الخمسة القياسية.
- تقبل بعض الأنظمة @hourly و@daily و@weekly و@monthly و@yearly كاختصارات.
- أدنى دقة هي دقيقة واحدة؛ والجدولات دون الدقيقة تحتاج إلى آلية مختلفة.
اختبار تعبير cron
قبل النشر، الصق التعبير في أداة تحقق تعرض أوقات التشغيل القادمة في منطقتك الزمنية. تأكد من أن أول تشغيل في الوقت المتوقع، وأن الفاصل بين التشغيلات صحيح، وأن حالات نهاية الشهر وعطلة نهاية الأسبوع تتصرف كما ينبغي. ثم اجعل المهمة نفسها متساوية القوى (idempotent) — آمنة للتشغيل مرتين — لأن كل مجدوِل سيشغّلها مرتين أو يتخطاها مرة في نهاية المطاف.
الأسئلة الشائعة
ماذا يعني * * * * * في cron؟
كل دقيقة من كل ساعة من كل يوم. تعني كل نجمة «كل قيمة» في حقلها.
كيف أشغّل مهمة cron كل 5 دقائق؟
استخدم */5 * * * *. يعمل معامل الخطوة في حقل الدقيقة عند 0 و5 و10 … و55.
كيف أجدول مهمة كل يوم اثنين الساعة 9 صباحاً؟
0 9 * * 1 — الدقيقة 0، والساعة 9، وأي يوم من الشهر، وأي شهر، ويوم الأسبوع 1 (الاثنين).
هل الأحد 0 أم 7 في cron؟
كلاهما يعمل في معظم التطبيقات: 0 و7 يعنيان الأحد. استخدم SUN إذا كان المجدوِل يقبل الأسماء لتجنب اللبس.
أي منطقة زمنية يستخدم cron؟
المنطقة التي ضُبط عليها المجدوِل — منطقة النظام في crontab، وUTC في Cloudflare Workers، وUTC في GitHub Actions ما لم تحدّد الجدولة منطقة زمنية، ومنطقة kube-controller-manager في Kubernetes ما لم يضبط CronJob الحقل .spec.timeZone. حوّل توقيتك المحلي إلى تلك المنطقة عند كتابة التعبير.
لماذا لا تعمل مهمة cron الخاصة بي؟
الأسباب المعتادة: التعبير في المنطقة الزمنية الخطأ، أو أُعطي تعبير من ستة حقول لمجدوِل بخمسة حقول (أو العكس)، أو أن حقلي يوم الشهر ويوم الأسبوع يتحدان بـ OR، أو أن المهمة تعمل لكنها تفشل بصمت — راجع سجلات المجدوِل ومعاينة التشغيل القادم.
المراجع
- crontab — POSIX.1-2017 (IEEE Std 1003.1-2017)التعريف القياسي لسطر crontab ذي الحقول الخمسة ومعنى كل حقل.
- crontab(5) — Linux manual pageصيغة crontab في Linux (cron/Vixie)، بما فيها النطاقات والخطوات والقوائم والاختصارات مثل @hourly.
الأدوات المذكورة في هذا الدليل
أنشئ تعابير cron بصرياً وعاين أوقات التشغيل التالية.
ترجم أي تعبير cron إلى لغة إنجليزية مبسّطة واعرض أوقات التشغيل القادمة.
تحقق من صحة تعابير cron حقلاً بحقل مع رسائل خطأ دقيقة.
حوّل التاريخ والوقت بين المناطق الزمنية (الرياض، عمّان، دلهي، UTC، نيويورك، لندن…).
حوّل ثواني Unix epoch إلى تاريخ مقروء واحصل على وقت Unix الحالي.