شرح تعابير 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 من الاثنين إلى الجمعة.
تعبير cron خمسة حقول تُقرأ بحسب موضعها من اليسار إلى اليمين: الدقيقة، ثم الساعة، ثم يوم الشهر، ثم الشهر، ثم يوم الأسبوع؛ أما * فتترك حقلها بلا تقييد.

الساعة 09:00 من الاثنين إلى الجمعة

الجزء 1:0 الجزء 2:9 الجزء 3:* الجزء 4:* الجزء 5:1-5

الساعة 02:30 كل يوم

الجزء 1:30 الجزء 2:2 الجزء 3:* الجزء 4:* الجزء 5:*

كل دقيقة

الجزء 1:* الجزء 2:* الجزء 3:* الجزء 4:* الجزء 5:*

  1. 1الدقيقةالقيم المسموحة: 0–590: عند الدقيقة 0
  2. 2الساعةالقيم المسموحة: 0–239: عند الساعة 9
  3. 3يوم الشهرالقيم المسموحة: 1–31*: أي يوم من الشهر
  4. 4الشهرالقيم المسموحة: 1–12 أو JAN–DEC*: أي شهر
  5. 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

جرّبها: شارح تعابير cron

المعاملات: * و/ و- و,

  • * (النجمة) — كل قيمة. * في حقل الساعة تعني كل ساعة.
  • , (الفاصلة) — قائمة. ⁦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 القياسي.

جرّبها: مولّد تعابير 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

المناطق الزمنية: أكثر أخطاء 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

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

اختبار تعبير cron

قبل النشر، الصق التعبير في أداة تحقق تعرض أوقات التشغيل القادمة في منطقتك الزمنية. تأكد من أن أول تشغيل في الوقت المتوقع، وأن الفاصل بين التشغيلات صحيح، وأن حالات نهاية الشهر وعطلة نهاية الأسبوع تتصرف كما ينبغي. ثم اجعل المهمة نفسها متساوية القوى (idempotent) — آمنة للتشغيل مرتين — لأن كل مجدوِل سيشغّلها مرتين أو يتخطاها مرة في نهاية المطاف.

جرّبها: مدقّق تعابير cron جرّبها: محوّل طوابع Unix الزمنية

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

ماذا يعني ⁦* * * * *⁩ في 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، أو أن المهمة تعمل لكنها تفشل بصمت — راجع سجلات المجدوِل ومعاينة التشغيل القادم.

المراجع

الأدوات المذكورة في هذا الدليل

أنشئ تعابير cron بصرياً وعاين أوقات التشغيل التالية.

أدوات مساعدة

ترجم أي تعبير cron إلى لغة إنجليزية مبسّطة واعرض أوقات التشغيل القادمة.

أدوات مساعدة

تحقق من صحة تعابير cron حقلاً بحقل مع رسائل خطأ دقيقة.

أدوات مساعدة

حوّل التاريخ والوقت بين المناطق الزمنية (الرياض، عمّان، دلهي، UTC، نيويورك، لندن…).

أدوات مساعدة

أدلة أخرى

أدلة أخرى
تصميم الاختبارات

اختبار التاريخ والوقت

دليل اختبار التاريخ والوقت: حقن الساعة، ومحاكاة التواريخ المستقبلية، وإزاحة بيانات الاختبار، ونهايات الأشهر، والسنة الكبيسة، والمناطق الزمنية، ومشكلة 2038.

وقت القراءة 18 دقائق
JSON والبيانات

ما هو JSON؟

شرح JSON بلغة مبسّطة: ما هو، وأنواع القيم الست، وقواعد الصياغة التي يخطئ فيها الكثيرون، وكيفية تنسيقه والتحقق منه، ومقارنته بـ XML وYAML.

وقت القراءة 4 دقائق
الأمان

ما هو JWT؟ شرح رموز JSON Web Token

شرح مبسّط لـ JWT: الأجزاء الثلاثة للرمز، والمطالبات مثل exp وsub، وكيفية فك ترميزه والتحقق منه، ولماذا فك الترميز ليس تحققاً، وقواعد الأمان.

وقت القراءة 4 دقائق
الترميز

ما هو Base64؟ شرح الترميز

شرح Base64: ما هو وما ليس هو، وكيف يعمل الترميز، ولماذا يكبر الناتج بالثلث، والفرق بين Base64 وBase64URL، وحشو =، وكيفية الترميز وفك الترميز.

وقت القراءة 4 دقائق
أدوات مساعدة

ما هو UUID؟ الفرق بين v4 وv7 وبين UUID وGUID وULID

شرح UUID: صيغة الـ 128 بت، والفرق بين v4 وv7، ولماذا v7 أفضل لمفاتيح قواعد البيانات، ومقارنة UUID بـ GUID وULID، واحتمال التصادم، والتوليد والتحقق.

وقت القراءة 4 دقائق
الويب

شرح رموز حالة HTTP

شرح كل فئة من رموز حالة HTTP مع الرموز التي تقابلها فعلاً — 200 و301 و400 و401 و403 و404 و422 و429 و500 و502 و503 و504 — وسبب كل منها وأيها تعيده.

وقت القراءة 5 دقائق