ما هو cron؟
cron هو مُجدوِل المهام المبني على الوقت والمدمج في كل توزيعات لينكس. يُشغّل الأوامر والنصوص البرمجية تلقائيًا في أوقات أو تواريخ أو فواصل زمنية محددة — وهو مثالي للنسخ الاحتياطي، وتدوير السجلّات، وتجديد الشهادات، وتنظيف قواعد البيانات، وتشغيل مُجدولات التطبيقات. على أوبونتو يعمل المُجدوِل كخدمة في الخلفية تُسمى cron.service، وتحدّد ما ينبغي تشغيله في ملفات تُسمى crontabs.
يغطي هذا الدليل مهام cron الخاصة بكل مستخدم والمهام على مستوى النظام على أوبونتو 22.04/24.04 LTS، والصيغة الدقيقة، وكيفية التعامل مع البيئة والسجلّات، وكيفية إبقاء المهام المجدولة تعمل بموثوقية على خادم VPS أو خادم سحابي مُدار.
التحقق من أن cron مثبّت ويعمل
على أوبونتو، يأتي خادم cron من حزمة cron وعادة ما يكون مثبتًا مسبقًا. تحقق منه:
systemctl status cron
ينبغي أن ترى Active: active (running). إذا كانت الحزمة مفقودة، فثبّتها وفعّلها:
sudo apt update && sudo apt install -y cron
sudo systemctl enable --now cron
فهم صيغة crontab
كل مهمة cron هي سطر واحد يتكون من خمسة حقول للوقت والتاريخ يتبعها الأمر المراد تشغيله:
# ┌───────────── الدقيقة (0–59)
# │ ┌───────────── الساعة (0–23)
# │ │ ┌───────────── يوم الشهر (1–31)
# │ │ │ ┌───────────── الشهر (1–12)
# │ │ │ │ ┌───────────── يوم الأسبوع (0–7، حيث 0 و7 يمثلان الأحد)
# │ │ │ │ │
# * * * * * الأمر المراد تنفيذه
يقبل كل حقل ما يلي:
| العامل | المعنى | المثال |
|---|---|---|
* |
كل قيمة | * * * * * = كل دقيقة |
, |
قائمة | 0,30 * * * * = عند :00 و:30 |
- |
نطاق | 0 9-17 * * * = كل ساعة من 9 صباحًا حتى 5 مساءً |
/ |
خطوة | */15 * * * * = كل 15 دقيقة |
بعض الأمثلة التطبيقية:
0 2 * * * # كل يوم عند الساعة 02:00
*/5 * * * * # كل 5 دقائق
30 3 * * 1 # الساعة 03:30 كل يوم اثنين
0 0 1 * * # منتصف الليل في اليوم الأول من كل شهر
0 8 * * 1-5 # الساعة 08:00 من الاثنين إلى الجمعة
يمكنك أيضًا استخدام هذه السلاسل المختصرة بدلًا من الحقول الخمسة: @reboot و@hourly و@daily و@weekly و@monthly و@yearly. على سبيل المثال، يُشغّل @reboot المهمة مرة واحدة في كل مرة يقلع فيها الخادم.
إنشاء مهمة cron خاصة بمستخدم
ينبغي تشغيل معظم مهام التطبيقات بصلاحيات مستخدم عادي، وليس بصلاحيات root. حرّر ملف crontab الخاص بمستخدمك بالأمر:
crontab -e
في المرة الأولى، سيُطلب منك اختيار محرّر (nano هو الأبسط). أضف مهمة — على سبيل المثال، تشغيل نص نسخ احتياطي كل يوم عند الساعة 1:30 صباحًا وتسجيل المخرجات:
30 1 * * * /home/deploy/scripts/backup.sh >> /home/deploy/logs/backup.log 2>&1
احفظ واخرج. يُثبّت cron الجدول الجديد على الفور — دون الحاجة لإعادة التشغيل. اعرض مهامك بالأمر crontab -l، واحذفها جميعًا بالأمر crontab -r (استخدمه بحذر).
الجزء >> file 2>&1 يُلحق كلًا من المخرجات القياسية والأخطاء بملف سجلّ. وهذا مهم: افتراضيًا يُرسل cron المخرجات عبر البريد إلى المستخدم المحلي، وهو ما لا تراه عادةً، لذا فإن التسجيل الصريح هو وسيلتك لتصحيح الأخطاء.
المهام على مستوى النظام ودلائل run-parts
تعيش مهام مستوى root والمهام المُحزَّمة في /etc/crontab و/etc/cron.d/. تحتوي هذه الملفات على حقل إضافي واحد — وهو اسم المستخدم — بين حقول الوقت والأمر:
# m h dom mon dow user command
0 4 * * * root /usr/local/bin/cleanup.sh
في الحالات الشائعة لا تحتاج حتى إلى كتابة جدول. يُشغّل أوبونتو أي شيء تضعه في هذه الدلائل بإيقاع ثابت:
/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/
ضع نصًا برمجيًا قابلًا للتنفيذ (دون امتداد ملف، مع chmod +x) في /etc/cron.daily/ وسيعمل مرة واحدة يوميًا. هذه أنظف طريقة لنشر نصوص الصيانة.
مزالق البيئة ومسار PATH
السبب الأكثر شيوعًا لكون المهمة "تعمل في الطرفية لكن ليس في cron" هو البيئة. يعمل cron بمسار PATH بسيط (عادةً /usr/bin:/bin) ولا يُحمّل ملف .bashrc أو ملف الإعداد الخاص بك. هناك حلّان:
- استخدم دائمًا المسارات المطلقة للبرامج والملفات (
/usr/bin/phpوليسphp). - اضبط المتغيرات في أعلى ملف crontab:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=ops@example.com
SHELL=/bin/bash
*/10 * * * * cd /var/www/app && /usr/bin/php artisan schedule:run >> /var/log/app-cron.log 2>&1
لاحظ أن MAILTO="" يُعطّل كل البريد؛ وضبطه على عنوان يُرسل مخرجات المهمة إليه إذا كان هناك مُرسل بريد مُهيّأ.
المناطق الزمنية
يستخدم cron المنطقة الزمنية لنظام الخادم، وليس منطقتك المحلية — وهو أمر يسهل نسيانه عندما يكون فريقك في الرياض بينما يكون الخادم افتراضيًا على UTC. تحقق منها واضبطها:
timedatectl # يعرض المنطقة الزمنية الحالية
sudo timedatectl set-timezone Asia/Riyadh
بعد تغيير المنطقة الزمنية، أعد تشغيل cron حتى تلتقط المهام العاملة التغيير: sudo systemctl restart cron. استضافة خادمك داخل المملكة تعني أنه متوافق طبيعيًا مع توقيت الرياض ومع متطلبات إقامة البيانات وفق نظام حماية البيانات الشخصية (PDPL).
التحقق من المهام وتصحيح أخطائها
على أوبونتو، يُسجَّل نشاط cron في سجلّ النظام (journal) وفي /var/log/syslog (لا يوجد ملف /var/log/cron منفصل افتراضيًا). راقب عمليات التنفيذ مباشرةً:
grep CRON /var/log/syslog | tail
journalctl -u cron --since "1 hour ago"
إذا لم تعمل المهمة، فتحقق بالترتيب التالي: أن خدمة cron تعمل، وأن السطر يحتوي على خمسة حقول وقت بالضبط (أو سلسلة @ واحدة)، وأن النص البرمجي قابل للتنفيذ، وأن ملف السجلّ يُظهر مخرجات الأمر. لإثبات أن النص يعمل في بيئة cron المُجرّدة، اختبره بالأمر env -i /bin/bash -c '/path/to/script.sh'.
تقييد من يمكنه استخدام cron
للتحكّم في المستخدمين المسموح لهم بتثبيت ملفات crontab، أنشئ الملف /etc/cron.allow (قائمة سماح) أو /etc/cron.deny (قائمة منع). إذا كان /etc/cron.allow موجودًا، فلن يتمكن من استخدام crontab سوى المستخدمين المدرجين فيه — وهي خطوة تقوية منطقية على خادم مشترك.
شغّلها بموثوقية على سكاي لاين كلاود
مهمة cron لا تكون موثوقة إلا بقدر موثوقية الخادم الذي تعمل عليه. على خادم VPS أو خادم سحابي من سكاي لاين كلاود، تعمل نسخك الاحتياطية المجدولة، وتوليد التقارير، ومهام التجديد على بنية تحتية تعمل دون انقطاع ومُستضافة في مراكز بيانات سعودية، مع دعم عربي محلي وإقامة بيانات متوافقة مع PDPL/NCA. اقرنها مع استضافة البريد التجاري من سكاي لاين لتصل تنبيهات MAILTO حول المهام الفاشلة إلى فريقك فعليًا.
هل أنت مستعد لأتمتة أعباء عملك على بنية تحتية داخل المملكة؟ أنشئ حسابك في سكاي لاين كلاود وانشر خادم VPS في دقائق.
Comments
0 total · 0 threads