صيغة node-cron
يتكوّن تعبير node-cron من خمسة حقول، أو ستة عند إضافة الثواني في البداية. ومع خمسة حقول تعمل المهمة عند الثانية 0:
| الحقل | القيم المسموحة | الرموز الخاصة |
|---|---|---|
| الثانية | 0–59 (اختياري، ويأتي أولًا) | , - * / |
| الدقيقة | 0–59 | , - * / |
| الساعة | 0–23 | , - * / |
| يوم الشهر | 1–31 | , - * ? / L W |
| الشهر | 1–12 أو الأسماء (JAN أو January) | , - * / |
| يوم الأسبوع | 0–7 أو الأسماء (0 و7 = الأحد) | , - * ? / L # |
الرموز الخاصة
| الرمز | المعنى |
|---|---|
/ | الخطوة، وتُكتب بعد * أو بعد نطاق: */10 أو 5-59/15. أما قيمة البداية المجردة مثل 5/15 فمرفوضة. |
- | النطاقات. ومنذ الإصدار 4.6 يلتف النطاق المعكوس إلى البداية، فـ 22-2 في حقل الساعة يعني من 22:00 إلى 02:59، أما الإصدارات الأقدم فتقلبه بصمت إلى 2-22. |
L | في حقل يوم الشهر يعني L آخر يوم في الشهر (من الإصدار 4.3)، وL-3 ما قبله بثلاثة أيام (من 4.6). وفي حقل يوم الأسبوع يعني 5L آخر جمعة في الشهر (من 4.5). |
W | أقرب يوم عمل إلى تاريخ معيّن: 15W، أو LW لآخر يوم عمل في الشهر (من 4.6). |
# | ترتيب اليوم في الشهر: 1#1 هو أول إثنين (من 4.5). |
? | مثل *، ويُقبل في حقلي اليوم حتى تُقرأ التعبيرات المكتوبة بأسلوب Quartz (من 4.6). |
أمثلة على كرون node-cron
اضغط على أي تعبير لتحميله في المولّد أعلاه.
| التعبير | الجدول الزمني |
|---|---|
| كل ثانية. | |
| كل 10 ثوانٍ. | |
| كل 5 دقائق. | |
| في تمام الساعة 8:30 ص، من الإثنين إلى الجمعة. | |
| في تمام الساعة 9:00 ص، من الإثنين إلى الجمعة. | |
| كل 15 دقيقة، بين 10:00 م و2:59 ص. | |
| في تمام الساعة 12:00 ص، في آخر يوم من الشهر. | |
| في تمام الساعة 9:00 ص، قبل آخر يوم من الشهر بـ 3 أيام. | |
| في تمام الساعة 9:00 ص، في أول إثنين من الشهر. | |
| في تمام الساعة 5:00 م، في آخر جمعة من الشهر. | |
| في تمام الساعة 12:00 ص، في اليوم 13 من الشهر، بشرط أن يوافق ذلك اليوم يوم الجمعة. | |
| في تمام الساعة 12:00 ص. |
الفرق بين node-cron وكرون تاب في لينكس
- يأتي حقل الثواني الاختياري أولًا، فالتعبير
*/10 * * * * *يعمل كل 10 ثوانٍ، بينما لا يعرف كرون تاب الثواني أصلًا. - إذا حدّدت يوم الشهر ويوم الأسبوع معًا فيجب أن يتطابقا معًا: فالتعبير
0 0 13 * 5لا يعمل إلا يوم الجمعة الموافق 13، أما كرون تاب فيشغّله في كل يوم 13 وفي كل جمعة. - الرموز
LوWو#مأخوذة من Quartz، لكن ترقيم الأيام ليس كذلك:1تعني الإثنين كما في كرون تاب، ويمكن تحديد حقلي اليوم معًا. - تعمل المهام داخل عملية Node.js نفسها، فلا يعمل شيء أثناء توقفها، وتشغّل كل نسخة من تطبيقك نسختها الخاصة من المهمة ما لم تضبط
distributed: true(من 4.4). - من دون الخيار
timezoneتتبع الجداول المنطقة الزمنية لعملية Node.js، وغالبًا ما تكون UTC على الخوادم وداخل الحاويات.
الاستخدام في Node.js
جدول دالة باستخدام cron.schedule(). في الإصدار 4 من node-cron تبدأ المهمة فورًا، وتحدّد الخيارات المنطقة الزمنية وتتخطى أي تشغيل جديد ما دام السابق لم ينتهِ:
import cron from 'node-cron';
const task = cron.schedule('0 30 8 * * 1-5', async () => {
await sendDailyReport();
}, {
name: 'daily-report',
timezone: 'Asia/Riyadh',
noOverlap: true,
});
cron.validate('0 30 8 * * 1-5'); // true
task.getNextRuns(3); // the next three run dates (4.4+)
تقرأ node-cron 3 بعض التعبيرات بطريقة مختلفة: فالخطوة فيها لا تُبقي إلا القيم التي تقبل القسمة عليها، لذا يعمل 5-59/15 عند الدقائق 15 و30 و45 بدلًا من 05 و20 و35 و50. نفّذ npm ls node-cron لمعرفة الإصدار المثبّت لديك.
الأسئلة الشائعة
كيف أشغّل مهمة node-cron كل 10 ثوانٍ؟
أضف حقل الثواني في البداية: cron.schedule('*/10 * * * * *', task). ومع خمسة حقول تعمل node-cron عند الثانية 0، فالتعبير * * * * * يعمل مرة كل دقيقة.
ما إصدار node-cron الذي يدعم الرموز L وW و#؟
أُضيف L في حقل يوم الشهر في الإصدار 4.3، و# و5L في 4.5، وW وL-n و? في 4.6 الذي جعل النطاقات المعكوسة مثل 22-2 تلتف أيضًا. ولا تدعم node-cron 3 أيًّا منها، وينبّهك المولّد عندما يحتاج التعبير إلى إصدار أحدث.
كيف أحدّد المنطقة الزمنية في node-cron؟
مرّر اسم المنطقة بصيغة IANA في الخيارات: cron.schedule('0 8 * * *', task, { timezone: 'Asia/Dubai' }). ومن دونه تستخدم node-cron المنطقة الزمنية لعملية Node.js.
هل تعمل هذه التعبيرات في مكتبات كرون أخرى بلغة JavaScript؟
تتشارك معظم مجدولات Node.js، مثل حزمة cron ومكتبة Croner، صيغة الخمسة والستة حقول، لكن التفاصيل تختلف، ومنها طريقة الجمع بين حقلي اليوم والرموز الخاصة المدعومة. اختبر التعبير مع المكتبة التي تستخدمها، فهذا المولّد يتبع node-cron.
مولدات كرون لمنصات أخرى
*/15 8-18 * * 1-5
مولد تعبيرات كرون Quartz
0 0 8 ? * MON-FRI
مولد تعبيرات كرون لـ Spring
0 0 8 * * MON-FRI
مولد تعبيرات كرون لـ AWS
0 8 ? * MON-FRI *
مولد تعبيرات كرون لـ Jenkins
H 2 * * 1-5
مولد تعبيرات كرون لـ Salesforce
0 0 8 ? * MON-FRI
مولد تعبيرات كرون لـ Hangfire
0 8 * * 1-5
مولد تعبيرات كرون لـ Airflow
0 6 * * 1-5