الفرق بين cron وcrontab ومهمة الكرون
ثلاث كلمات يخلط بينها كثيرون:
- cron هو البرنامج الخدمي (daemon) الذي يعمل في الخلفية ويستيقظ كل دقيقة ليشغّل كل مهمة يطابق جدولها الوقت الحالي. اسمه
cronفي Debian وUbuntu، وcrondفي RHEL وCentOS وFedora وRocky وAlmaLinux. - crontab (اختصار «cron table» أي جدول الكرون) هو الملف الذي يحتوي على المهام، وهو أيضًا الأمر الذي تعدّل به هذا الملف. لكل مستخدم ملف كرون تاب خاص به.
- مهمة الكرون (cron job) هي سطر واحد في ملف كرون تاب: جدول زمني مكتوب على شكل تعبير كرون يليه الأمر المطلوب تنفيذه.
# minute hour day-of-month month day-of-week command
30 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
تعمل هذه المهمة كل ليلة الساعة 2:30 صباحًا. أنشئ الجزء الخاص بالجدول باستخدام مولد تعبيرات الكرون، أو الصق سطرًا جاهزًا في مفسر تعبيرات الكرون لتتحقق منه.
أوامر crontab
| الأمر | ماذا يفعل |
|---|---|
crontab -e | يفتح ملف كرون تاب الخاص بك في محرر نصوص، ويثبّته عند الحفظ. في المرة الأولى يبدأ بملف فارغ. |
crontab -l | يعرض محتوى ملف كرون تاب. إن لم يكن لديك ملف تظهر رسالة «no crontab for <user>». |
crontab -r | يحذف ملف كرون تاب بالكامل فورًا ودون أي سؤال. |
crontab -ri | يطلب التأكيد قبل الحذف (يعمل الخيار -i مع -r في لينكس). |
sudo crontab -u alice -l | يعرض ملف مستخدم آخر. يعمل الخيار -u أيضًا مع -e و-r، ويحتاج صلاحيات الجذر. |
crontab mycron.txt | يستبدل ملف كرون تاب بمحتوى ملف آخر. |
crontab -l > crontab.bak | يحفظ نسخة احتياطية من ملف كرون تاب. |
في معظم لوحات المفاتيح يقع الحرف r بجوار e، والأمر crontab -r يحذف كل المهام دون إمكانية التراجع. خذ نسخة احتياطية أولًا بالأمر crontab -l > ~/crontab.bak، واستعدها بالأمر crontab ~/crontab.bak.
كيف تنشئ مهمة كرون باستخدام crontab -e
- افتح ملف كرون تاب:
في المرة الأولى على Ubuntu أو Debian سيُطلب منك اختيار محرر، وnano هو الأسهل. يمكنك تغييره لاحقًا بالأمرcrontab -eselect-editor، أو لمرة واحدة بالأمرEDITOR=nano crontab -e. - أضف المهمة في سطر جديد: الجدول الزمني ثم الأمر. استخدم المسارات الكاملة ووجّه المخرجات إلى ملف سجل:
*/15 * * * * /home/alice/bin/sync.sh >> /home/alice/sync.log 2>&1 - احفظ واخرج. في nano اضغط Ctrl+O ثم Enter ثم Ctrl+X، وفي vim اكتب
:wq. يتحقق crontab من الملف ويعرضcrontab: installing new crontab. وإذا وُجد خطأ في الصيغة فسيخبرك ويعرض إعادة فتح المحرر، ولن يُثبَّت شيء حتى يصبح الملف صحيحًا. - تأكّد من الحفظ بالأمر
crontab -l. لا حاجة لإعادة تشغيل أي شيء، فـ cron يلاحظ التغيير خلال دقيقة. - تأكّد من التنفيذ بعد أول موعد مجدول. راجع طريقة فحص سجلات الكرون أدناه.
صيغة ملف كرون تاب
ملف كرون تاب ملف نصي عادي يحتوي على مدخل واحد في كل سطر. يشرح مرجع صيغة الكرون حقول الوقت الخمسة، أما بقية الملف فتتبع هذه القواعد:
- الأسطر التي تبدأ بالرمز
#تعليقات، والأسطر الفارغة يتم تجاهلها. - الأسطر مثل
NAME=valueتحدد متغيرات البيئة للمهام التي تليها:SHELLوPATHوMAILTO، وCRON_TZفي cronie. - يمكن أن تحل الاختصارات مثل
@rebootو@dailyو@hourlyمحل حقول الوقت الخمسة. - علامة
%داخل الأمر تتحول إلى سطر جديد، وكل ما بعد أول علامة يُمرَّر إلى الأمر كمدخلات. اكتب\%عندما تحتاج علامة نسبة مئوية فعلية، كما فيdate +\%F. - يجب أن ينتهي السطر الأخير بسطر جديد. الملفات المعدّلة بالأمر
crontab -eتحتوي عليه عادةً، أما الملفات التي تثبّتها بالأمرcrontab fileفقد لا تحتوي عليه. - احفظ الملف بنهايات أسطر يونكس. نهايات أسطر ويندوز (CRLF) تُفسد المدخلات، ويمكنك تحويلها بالأمر
dos2unix.
هكذا يبدو ملف كرون تاب كامل لمستخدم:
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=""
# Back up the database every night at 2:30
30 2 * * * /usr/local/bin/db-backup.sh >> /var/log/db-backup.log 2>&1
# Clear the cache every 15 minutes during office hours
*/15 9-17 * * 1-5 /usr/local/bin/clear-cache.sh
# Start the queue worker after every reboot
@reboot /usr/local/bin/start-worker.sh
السطر MAILTO="" يمنع cron من إرسال مخرجات كل مهمة بالبريد. فبدونه يرسل cron أي مخرجات إلى صاحب الملف إن كان خادم بريد مثبتًا، وإلا فإنها تضيع. وفي الحالتين يبقى تسجيل المخرجات في ملف هو الخيار الموثوق.
أين تُحفظ ملفات كرون تاب
| المسار | ماذا يحتوي |
|---|---|
/var/spool/cron/crontabs/<user> | ملفات المستخدمين في Debian وUbuntu |
/var/spool/cron/<user> | ملفات المستخدمين في RHEL وCentOS وFedora وRocky وAlmaLinux |
/etc/crontab | ملف كرون تاب الخاص بالنظام، وفيه عمود إضافي لاسم المستخدم |
/etc/cron.d/ | ملفات نظام إضافية تضيفها الحزم أو أدوات الإعداد، بالصيغة نفسها |
/etc/cron.daily/، /etc/cron.hourly/، /etc/cron.weekly/، /etc/cron.monthly/ | سكربتات يشغّلها run-parts (أو anacron) مرة كل ساعة أو يوم أو أسبوع أو شهر |
/etc/cron.allow، /etc/cron.deny | تحديد المستخدمين المسموح لهم باستخدام الأمر crontab |
عدّل ملفات المستخدمين فقط بالأمر crontab -e، لأنه يتحقق من الصيغة ويضمن أن يعيد cron تحميل الملف. أما ملفات النظام فتُعدَّل مباشرة بصلاحيات الجذر، ويحتوي كل سطر فيها على اسم المستخدم بين الجدول والأمر:
# minute hour dom month dow user command
0 3 * * * root /usr/local/sbin/rotate-backups.sh
في Debian وUbuntu يتم تجاهل الملفات في /etc/cron.d/ والسكربتات في /etc/cron.daily/ وبقية المجلدات إذا احتوى اسمها على نقطة، لذا فالملف backup.sh لن يعمل هناك أبدًا، وسمّه backup. كما يجب أن تكون ملفات /etc/cron.d/ مملوكة للجذر وغير قابلة للكتابة من المجموعة أو الآخرين، وأن تكون السكربتات في المجلدات الأخرى قابلة للتنفيذ.
كيف تتأكد من تنفيذ مهمة الكرون
# Ubuntu and Debian
grep CRON /var/log/syslog
journalctl -u cron --since today
# RHEL, CentOS, Fedora, Rocky, AlmaLinux
sudo tail -n 50 /var/log/cron
journalctl -u crond --since today
# Is the cron service running?
systemctl status cron # Debian / Ubuntu
systemctl status crond # RHEL family
سطر السجل مثل CMD (/usr/local/bin/backup.sh) يثبت فقط أن cron بدأ تشغيل الأمر. أما نجاح السكربت فتجده في مخرجاته، ولهذا يوجّه كل مثال في هذه الصفحة مخرجاته إلى ملف سجل. إصدارات Debian الحديثة لا تثبّت rsyslog، لذلك قد لا يوجد الملف /var/log/syslog، فاستخدم journalctl بدلًا منه.
لماذا لا تعمل مهمة الكرون؟
راجع هذه القائمة بالترتيب، فأول ثلاثة أسباب تفسّر معظم الحالات.
- الأمر غير موجود. يشغّل cron المهام بمتغير
PATHمحدود، غالبًا/usr/bin:/binفقط. استخدم المسارات الكاملة، أو حدّدPATH=في أعلى الملف. - بيئة مختلفة. لا يقرأ cron الملفين
~/.bashrcو~/.profile، لذلك تغيب متغيراتك واختصاراتك وأدوات مثل nvm وpyenv والبيئات الافتراضية. استدعِ المفسّرات بمسارها الكامل مثل/home/alice/venv/bin/python. - السكربت غير قابل للتنفيذ أو ليس فيه سطر shebang. نفّذ
chmod +x script.shوابدأ السكربت بالسطر#!/bin/bash. - علامة
%غير مهرّبة قطعت الأمر. اكتبها هكذا\%. - المنطقة الزمنية ليست كما تتوقع. يستخدم cron المنطقة الزمنية للخادم، وغالبًا تكون UTC في الخوادم السحابية. تحقّق منها بالأمر
timedatectl. - الخدمة متوقفة. شغّلها بالأمر
sudo systemctl enable --now cron(أوcrondفي RHEL). - حقلا اليوم محددان معًا. التعبير
0 9 1 * 1يعمل في اليوم الأول من الشهر وأيضًا كل يوم إثنين، لأن cron يربط حقلي اليوم بمنطق «أو». - غير مسموح لك باستخدام cron. راجع الملفين
/etc/cron.allowو/etc/cron.deny. - اسم الملف يحتوي على نقطة في
/etc/cron.d/أو/etc/cron.daily/على Debian أو Ubuntu. - غياب السطر الجديد في النهاية أو نهايات أسطر ويندوز في ملف ثُبّت من ملف آخر.
لتختبر الأمر كما يشغّله cron، شغّله ببيئة شبه فارغة:
env -i HOME="$HOME" SHELL=/bin/sh PATH=/usr/bin:/bin /bin/sh -c '/usr/local/bin/backup.sh'
إذا فشل هنا فسيفشل مع cron أيضًا.
أمثلة على أسطر كرون تاب
| سطر كرون تاب | يعمل |
|---|---|
*/5 * * * * /usr/local/bin/check-site.sh | كل 5 دقائق. |
0 * * * * /usr/local/bin/rotate-logs.sh | عند الدقيقة 0 من كل ساعة. |
0 2 * * * /usr/local/bin/db-backup.sh | في تمام الساعة 2:00 ص. |
0 9 * * 1-5 /usr/local/bin/send-report.sh | في تمام الساعة 9:00 ص، من الإثنين إلى الجمعة. |
0 0 * * 0 find /tmp -type f -mtime +7 -delete | في تمام الساعة 12:00 ص، يوم الأحد فقط. |
0 0 1 * * /usr/local/bin/monthly-invoice.sh | في تمام الساعة 12:00 ص، في اليوم 1 من الشهر. |
@reboot /usr/local/bin/start-worker.sh | مرة واحدة عند بدء تشغيل النظام (خدمة cron). |
مزيد من الجداول الجاهزة في أمثلة تعبيرات الكرون.
كرون تاب في macOS
لا يزال macOS يتضمن cron، ويعمل الأمر crontab -e كما في لينكس. لكن Apple توصي باستخدام launchd، وفي الإصدارات الحديثة لا يستطيع cron قراءة المجلدات المحمية مثل سطح المكتب والمستندات حتى تمنح /usr/sbin/cron صلاحية «الوصول الكامل إلى القرص» من إعدادات النظام ← الخصوصية والأمن.
cron أم مؤقتات systemd؟
توفر معظم توزيعات لينكس أيضًا مؤقتات systemd (systemctl list-timers). فهي تسجّل كل تشغيل في سجل journal، ويمكنها تعويض المواعيد الفائتة أثناء إيقاف الجهاز (Persistent=true)، ولا تبدأ نسخة ثانية ما دامت الأولى تعمل. ومع ذلك يبقى cron الخيار الأسرع لمهمة من سطر واحد، وصيغة جدوله مستخدمة خارج لينكس أيضًا، من Kubernetes إلى GitHub Actions.
الأسئلة الشائعة
ماذا يفعل الأمر crontab -e؟
يفتح ملف كرون تاب الخاص بك في محرر نصوص (المحدد في VISUAL أو EDITOR)، وعند الحفظ والخروج يتحقق من الصيغة ثم يثبّت الملف. وإن لم يكن لديك ملف بعد فإنه يبدأ بملف فارغ.
كيف أعرض كل مهام الكرون؟
مهامك أنت: crontab -l. مهام مستخدم آخر: sudo crontab -l -u alice. ولكل المستخدمين استخدم حلقة: for u in $(cut -d: -f1 /etc/passwd); do sudo crontab -l -u "$u" 2>/dev/null; done، ثم راجع أيضًا /etc/crontab و/etc/cron.d/ ومجلدات /etc/cron.*.
كيف أحذف مهمة كرون واحدة؟
نفّذ crontab -e، واحذف سطر المهمة (أو حوّله إلى تعليق بالرمز #) ثم احفظ. لا تستخدم crontab -r لهذا الغرض، فهو يحذف كل المهام في الملف.
هل أحتاج إلى إعادة تشغيل cron بعد تعديل الملف؟
لا. يفحص cron الملفات المعدّلة كل دقيقة، لذلك تُلتقط المهام المضافة بالأمر crontab -e أو في /etc/crontab و/etc/cron.d/ تلقائيًا.
كيف أغيّر محرر crontab -e؟
في Ubuntu وDebian نفّذ select-editor. وفي غيرهما حدّد المتغير EDITOR (أو VISUAL)، مثل export EDITOR=nano في الملف ~/.bashrc، أو لمرة واحدة: EDITOR=nano crontab -e.
كيف أشغّل مهمة كرون بصلاحيات الجذر؟
عدّل ملف المستخدم root بالأمر sudo crontab -e، أو أضف ملفًا إلى /etc/cron.d/ تذكر أسطره root اسمًا للمستخدم، مثل 0 3 * * * root /usr/local/sbin/cleanup.
أين يوجد ملف كرون تاب؟
ملفات المستخدمين في /var/spool/cron/crontabs/ على Debian وUbuntu، وفي /var/spool/cron/ على الأنظمة المبنية على RHEL. أما ملف النظام فهو /etc/crontab، مع ملفات إضافية في /etc/cron.d/. عدّل ملفك بالأمر crontab -e بدلًا من فتح الملف مباشرة.