DevToolPal
ع

تعبير Cron

آخر يوم من كل شهر

لا يحتوي cron القياسي على رمز «آخر يوم»، لذا تعمل المهمة في الأيام 28–31 ويسمح اختبار shell بالمتابعة فقط إذا كان الغد هو اليوم الأول.

0 0 28-31 * * افتح في محلّل تعبيرات Cron

يستخدم سطر crontab الأمر GNU date ‏(date -d tomorrow)؛ وعلى macOS استخدم date -v+1d. يدعم Quartz وSpring الرمز L مباشرة. في Kubernetes وGitHub Actions أضف التحقق نفسه من التاريخ في بداية المهمة.

شرح كل حقل

الحقل القيمة يطابق
الدقيقة 0 0
الساعة 0 0
يوم الشهر 28-31 28, 29, 30, 31
الشهر * كل القيم
يوم الأسبوع * كل القيم

أوقات التشغيل القادمة

مثال: أول 6 مرات تشغيل بعد 1 يناير 2026 (UTC).

  1. السبت، 31 يناير 2026، 00:00
  2. السبت، 28 فبراير 2026، 00:00
  3. الثلاثاء، 31 مارس 2026، 00:00
  4. الخميس، 30 أبريل 2026، 00:00
  5. الأحد، 31 مايو 2026، 00:00
  6. الثلاثاء، 30 يونيو 2026، 00:00

نسخ جاهزة للاستخدام

crontab
0 0 28-31 * * [ "$(date -d tomorrow +\%d)" = 01 ] && /path/to/command

أضف السطر باستخدام crontab -e. يعمل وفق المنطقة الزمنية للخادم ما لم يُضبط CRON_TZ أو TZ.

Kubernetes CronJob
apiVersion: batch/v1
kind: CronJob
metadata:
  name: last-day-of-month
spec:
  schedule: "0 0 28-31 * *"
  timeZone: "Etc/UTC"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: job
              image: busybox:1.36
              command: ["/bin/sh", "-c", "date; echo run"]

اضبط spec.timeZone (‏Kubernetes 1.27 فأحدث)؛ وبدونه يتبع الجدول المنطقة الزمنية لـ controller manager، وهي UTC غالبًا.

GitHub Actions
on:
  schedule:
    - cron: '0 0 28-31 * *'
  workflow_dispatch:

يستخدم GitHub Actions توقيت UTC دائمًا، ويقبل فواصل لا تقل عن 5 دقائق، وقد يتأخر بدء التشغيل المجدول عند الضغط.

Quartz
0 0 0 L * ?

يضع Quartz الثواني أولًا ويتطلب ? في يوم الشهر أو يوم الأسبوع. تُرقَّم الأيام من 1 إلى 7 بدءًا من الأحد، لذا فالأسماء أكثر أمانًا.

Spring
@Scheduled(cron = "0 0 0 L * *")

يستخدم Spring ‏@Scheduled(cron = …) ستة حقول: الثواني ثم الحقول الخمسة المعتادة.

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

› لماذا تُكتب % على شكل \% في crontab؟

في سطر crontab تعني % سطرًا جديدًا (مدخلًا للأمر). اكتب \% ليصل تنسيق التاريخ إلى shell كما هو.

› بأي منطقة زمنية يعمل 0 0 28-31 * *؟

يستخدم cron المنطقة الزمنية للجهاز أو الخدمة التي تشغّله. في لينكس هي منطقة النظام ما لم يُضبط CRON_TZ أو TZ؛ وتقبل CronJob في Kubernetes الحقل spec.timeZone؛ ويستخدم GitHub Actions توقيت UTC دائمًا.

› كيف أتحقق من هذا الجدول قبل النشر؟

افتح 0 0 28-31 * * في محلّل تعبيرات Cron على هذا الموقع. يشرح كل حقل ويعرض أوقات التشغيل القادمة بتوقيتك المحلي أو بتوقيت UTC، داخل المتصفح مباشرة.