CRONTAB(5)

الاسم
crontab - ملفات تُستخدم لجدولة تنفيذ البرامج

الوصف
يحتوي ملف crontab على تعليمات للبرنامج الخفي cron(8) بالطريقة المبسطة التالية: "نفّذ هذا الأمر في هذا الوقت في هذا التاريخ". يمكن لكل مستخدم تعريف crontab خاص به. تُنفّذ الأوامر المُعرّفة في أي crontab معين تحت حساب المستخدم المالك لذلك crontab. عادةً ما يكون لـ Uucp و News crontabs خاصة بهما، مما يلغي الحاجة إلى تشغيل su(1) صراحةً كجزء من أمر cron.

تُتجاهل الأسطر الفارغة والمسافات البادئة وعلامات التبويب. الأسطر التي يكون أول حرف غير فارغ فيها هو علامة الجنيه (#) هي تعليقات، ولا تُعالج. لاحظ أن التعليقات غير مسموح بها في نفس سطر أوامر cron، لأنها تُعتبر جزءًا من الأمر. وبالمثل، التعليقات غير مسموح بها في نفس سطر إعدادات متغيرات البيئة.

السطر النشط في crontab هو إما إعداد بيئة أو أمر cron. إعداد البيئة يكون بالشكل:

   name = value

حيث المسافات البيضاء حول علامة التساوي (=) اختيارية، وأي مسافات بيضاء غير بادئة لاحقة في value هي جزء من القيمة المُسندة إلى name. يمكن وضع سلسلة value بين علامتي اقتباس (مفردة أو مزدوجة، ولكن متطابقة) للحفاظ على المسافات البيضاء البادئة أو التابعة.

يُعدّ البرنامج الخفي cron(8) عدة متغيرات بيئة آليًا. يُضبط SHELL على /bin/sh، ويُضبط LOGNAME و HOME من سطر /etc/passwd لمالك crontab. يمكن تجاوز HOME و SHELL بواسطة إعدادات في crontab؛ لا يمكن تجاوز LOGNAME.

(ملاحظة: يُسمى متغير LOGNAME أحيانًا USER في أنظمة BSD ويُضبط آليًا أيضًا).

بالإضافة إلى LOGNAME و HOME و SHELL، يفحص cron(8) متغير MAILTO إذا كان البريد بحاجة إلى الإرسال نتيجة تشغيل أي أوامر في ذلك crontab المعين. إذا كان MAILTO مُعرّفًا (وغير فارغ)، يُرسل البريد إلى العنوان المُحدد. إذا كان MAILTO مُعرّفًا ولكنه فارغ (MAILTO="")، لا يُرسل أي بريد. وإلا، يُرسل البريد إلى مالك crontab. هذا الخيار مفيد إذا قررت استخدام /bin/mail بدلاً من /usr/lib/sendmail كبريديّك. لاحظ أن /bin/mail لا يوفر الأسماء المستعارة و UUCP عادةً لا يقرأ بريده. إذا كان MAILFROM مُعرّفًا (وغير فارغ)، يُستخدم كعنوان مرسل الظرف، وإلا، يُستخدم اسم المستخدم للمستخدم المنفذ. هذا المتغير موروث أيضًا من بيئة عملية crond.

(ملاحظة: يُوَسَّعُ كل من متغيري MAILFROM و MAILTO، لذا فإن تعيينهما كما في المثال التالي يعمل كما هو متوقع: MAILFROM=cron-$USER@cron.com (يُسْتَبْدَلُ $USER بمستخدم النظام) )

مبدئيًا، يُرسل cron بريدًا باستخدام ترويسة 'Content-Type:' بقيمة 'text/plain' مع ضبط وسيط 'charset=' على 'charmap/codeset' للإعدادات المحلية التي يُبدأ فيها crond(8)، أي إما الإعدادات المحلية الافتراضية للنظام، إذا لم تُضبط أي متغيرات بيئة LC_*، أو الإعدادات المحلية المُحددة بواسطة متغيرات بيئة LC_* (انظر locale(7)). يمكن استخدام ترميزات أحرف مختلفة لإرسال مخرجات وظائف cron عبر البريد عن طريق ضبط متغيري CONTENT_TYPE و CONTENT_TRANSFER_ENCODING في crontab على القيم الصحيحة لترويسات البريد لتلك الأسماء.

يُحدد متغير CRON_TZ المنطقة الزمنية الخاصة بجدول cron. يجب على المستخدم إدخال وقت وفقًا للمنطقة الزمنية المُحددة في الجدول. الوقت المستخدم للكتابة في ملف السجل مأخوذ من المنطقة الزمنية المحلية، حيث يعمل البرنامج الخفي.

يوفر متغير البيئة MLS_LEVEL دعمًا لسياقات أمان SELinux متعددة لكل وظيفة في نفس crontab. مبدئيًا، تُنفذ وظائف cron بسياق أمان SELinux الافتراضي للمستخدم الذي أنشأ ملف crontab. عند استخدام مستويات وأدوار أمان متعددة، قد لا يكون هذا كافيًا، لأن نفس المستخدم قد يعمل بأدوار مختلفة أو بمستويات أمان مختلفة. لمزيد من المعلومات حول الأدوار و SELinux MLS/MCS، انظر selinux(8) ومثال crontab المذكور لاحقًا في هذا النص. يمكنك ضبط متغير MLS_LEVEL على سلسلة سياق أمان SELinux التي تُحدد سياق أمان SELinux المحدد الذي تريد تشغيل الوظائف فيه. سيضبط crond بعد ذلك سياق التنفيذ لتلك الوظائف التي تفي بمواصفات سياق الأمان المحدد. لمزيد من المعلومات، انظر خيار crontab(1) -s.

يسمح متغير RANDOM_DELAY بتأخير بدء الوظائف بمقدار عشوائي من الدقائق مع حد أقصى يُحدده المتغير. يُحدد عامل القياس العشوائي أثناء بدء تشغيل البرنامج الخفي cron بحيث يظل ثابتًا طوال وقت تشغيل البرنامج الخفي.

تنسيق أمر cron مشابه لمعيار V7، مع عدد من الامتدادات المتوافقة مع الإصدارات الأحدث. يحتوي كل سطر على خمسة حقول للوقت والتاريخ متبوعة باسم user (إذا كان هذا هو ملف crontab system)، متبوعة بأمر. تُنفذ الأوامر بواسطة cron(8) عندما تتطابق حقول 'الدقيقة' و 'الساعة' و 'شهر السنة' مع الوقت الحالي، و يتطابق حقل واحد على الأقل من حقلي 'اليوم' ('يوم الشهر' أو 'يوم الأسبوع') مع الوقت الحالي (انظر "ملاحظة" أدناه).

لاحظ أن هذا يعني أن الأوقات غير الموجودة، مثل "الساعات المفقودة" أثناء تحويل التوقيت الصيفي، لن تتطابق أبدًا، مما يتسبب في عدم تشغيل الوظائف المجدولة خلال "الأوقات المفقودة". وبالمثل، الأوقات التي تحدث أكثر من مرة (مرة أخرى، أثناء تحويل التوقيت الصيفي) ستتسبب في تشغيل الوظائف المتطابقة مرتين.

يفحص cron(8) إدخالات cron كل دقيقة.

حقول الوقت والتاريخ هي:

    الحقل    القيم المسموح بها
    -----    --------------
    minute    0-59
    hour    0-23
    day of month    1-31
    month    1-12 (or names, see below)
    يوم الأسبوع    0-7 (0 أو 7 هو الأحد، أو استخدم الأسماء)

قد يحتوي الحقل على علامة نجمية (*)، والتي تعني دائمًا "الأول-الأخير".

نطاقات الأرقام مسموح بها. النطاقات عبارة عن رقمين مفصولين بواصلة. النطاق المُحدد شامل. على سبيل المثال، 8-11 لإدخال 'ساعات' يُحدد التنفيذ في الساعات 8 و 9 و 10 و 11. يجب أن يكون الرقم الأول أقل من أو يساوي الثاني.

يمكن استخدام عشوائية وقت التنفيذ ضمن نطاق. يتم اختيار رقم عشوائي ضمن نطاق محدد برقمين مفصولين بعلامة التلدة. النطاق المحدد شامل. على سبيل المثال، 6~15 لإدخال 'دقائق' يختار دقيقة عشوائية ضمن نطاق 6 إلى 15. يتم اختيار الرقم العشوائي عند تحليل ملف crontab. يجب أن يكون الرقم الأول أقل من أو يساوي الثاني. يمكنك حذف أحد الرقمين أو كليهما اللذين يحددان النطاق. على سبيل المثال، ~ لإدخال 'دقائق' يختار دقيقة عشوائية ضمن نطاق 0 إلى 59.

القوائم مسموح بها. القائمة هي مجموعة من الأرقام (أو النطاقات) مفصولة بفواصل. أمثلة: "1,2,5,9", "0-4,8-12".

يمكن استخدام قيم الخطوة مع النطاقات. اتباع نطاق بـ "/<number>" يحدد تخطي قيمة الرقم عبر النطاق. على سبيل المثال، يمكن استخدام "0-23/2" في حقل 'الساعات' لتحديد تنفيذ الأمر كل ساعة أخرى (البديل في معيار V7 هو "0,2,4,6,8,10,12,14,16,18,20,22"). قيم الخطوة مسموح بها أيضًا بعد النجمة، لذا إذا حددت وظيفة لتشغيلها كل ساعتين، يمكنك استخدام "*/2". يرجى ملاحظة أن الخطوات تُقيّم فقط ضمن الحقل الذي تُطبق عليه. على سبيل المثال "*/23" في حقل الساعات يعني تنفيذ الوظيفة عند الساعة 0 والساعة 23 ضمن يوم تقويمي. انظر "ملاحظات" أدناه لحل بديل.

يمكن أيضًا استخدام الأسماء لحقول 'الشهر' و 'يوم الأسبوع'. استخدم الأحرف الثلاثة الأولى من اليوم أو الشهر المحدد (حالة الأحرف غير مهمة). النطاقات وقوائم الأسماء مسموح بها. أمثلة: "mon,wed,fri", "jan-mar".

إذا كان UID للمالك هو 0 (الجذر)، يمكن أن يكون الحرف الأول لإدخال crontab هو الحرف "-". هذا يمنع cron من كتابة رسالة syslog حول الأمر الجاري تنفيذه.

الحقل 'السادس' (بقية السطر) يحدد الأمر الذي سيتم تشغيله. سيتم تنفيذ جزء الأمر بالكامل من السطر، حتى سطر جديد أو حرف "%"، بواسطة /bin/sh أو بواسطة الصدفة المحددة في متغير SHELL لملف cron. حرف "%" في الأمر، ما لم يتم الهروب منه بخط مائل عكسي (\)، سيتم تحويله إلى أحرف سطر جديد، وسيتم إرسال جميع البيانات بعد أول % إلى الأمر كمدخل قياسي.

ملاحظة: يمكن تحديد يوم تنفيذ الأمر في الحقلين التاليين — 'يوم الشهر' و 'يوم الأسبوع'. إذا كان كلا الحقلين مقيدين (أي لا يحتويان على الحرف "*")، سيتم تشغيل الأمر عندما يطابق أي حقل الوقت الحالي. على سبيل المثال،
"30 4 1,15 * 5" سيتسبب في تشغيل أمر في الساعة 4:30 صباحًا في اليومين 1 و 15 من كل شهر، بالإضافة إلى كل يوم جمعة.

يمكن اختبار بناء جملة ملف crontab قبل التثبيت باستخدام الخيار -T. انظر crontab(1) للتفاصيل.

مثال لملف CRON
# use /bin/sh to run commands, no matter what /etc/passwd says
SHELL=/bin/sh
# mail any output to `paul', no matter whose crontab this is
MAILTO=paul
#
CRON_TZ=Japan
# run five minutes after midnight, every day
5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# run at 2:15pm on the first of every month -- output mailed to paul
15 14 1 * *     $HOME/bin/monthly
# run at 10 pm on weekdays, annoy Joe
0 22 * * 1-5    mail -s "It's 10pm" joe%Joe,%%Where are your kids?%
23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"
5 4 * * sun     echo "run at 5 after 4 every sunday"

الوظائف في /etc/cron.d/
الوظائف في cron.d و /etc/crontab هي وظائف نظام، تُستخدم عادة لأكثر من مستخدم، وبالتالي، هناك حاجة إضافية لاسم المستخدم. MAILTO في السطر الأول اختياري.

مثال لوظيفة في /etc/cron.d/job
#login as root
#create job with preferred editor (e.g. vim)
MAILTO=root
* * * * * root touch /tmp/file

ملاحظات
كما ذُكر أعلاه، تعمل قيم التخطي فقط ضمن الفترة الزمنية المرتبطة بها. على سبيل المثال، تحديد "0/35" لحقل الدقائق لإدخال crontab لن يتسبب في تنفيذ هذا الإدخال كل 35 دقيقة؛ بدلاً من ذلك، سيتم تنفيذه مرتين كل ساعة، عند 0 و 35 دقيقة. للتحكم الأكثر دقة يمكنك القيام بشيء مثل هذا:
* * * * * if [ $(expr \( $(date +%s) / 60 \) % 58) = 0 ]; then echo this runs every 58 minutes; fi
0 * * * * if [ $(expr \( $(date +%s) / 3600 \) % 23) = 0 ]; then echo this runs every 23 hours on the hour; fi
اضبط حسب الحاجة إذا كان أمر date(1) الخاص بك لا يقبل "+%s" كمحدد سلسلة تنسيق لإخراج الطابع الزمني الحالي لـ UNIX.

SELinux مع أمان متعدد المستويات (MLS)
في crontab، من المهم تحديد مستوى أمان بواسطة crontab -s أو تحديد المستوى المطلوب في السطر الأول من crontab. يتم تحديد كل مستوى في /etc/selinux/targeted/seusers. عند استخدام crontab في وضع MLS، من المهم بشكل خاص:
- التحقق/تغيير الدور الفعلي،
- تعيين دور لـ الدليل الصحيح، المستخدم للإدخال/الإخراج.

مثال لـ SELINUX MLS
# login as root
newrole -r sysadm_r
mkdir /tmp/SystemHigh
chcon -l SystemHigh /tmp/SystemHigh
crontab -e
# write in crontab file
MLS_LEVEL=SystemHigh
0-59 * * * * id -Z > /tmp/SystemHigh/crontest

الملفات
/etc/crontab ملف crontab الرئيسي للنظام. /var/spool/cron/ دليل لتخزين crontabs المعرفة من قبل المستخدمين. /etc/cron.d/ دليل لتخزين crontabs النظام.

انظر أيضًا
cron(8), crontab(1)

الامتدادات
أسماء مستعارة خاصة لمواصفات الوقت تحل محل حقول الوقت والتاريخ الخمسة الأولية، وتسبقها علامة '@'، مدعومة:

@reboot    :    يُنفَّذ مرة واحدة بعد إعادة التشغيل.
@yearly    :    يُنفَّذ مرة واحدة في السنة، على سبيل المثال: ”0 0 1 1 *“.
@annually  :    يُنفَّذ مرة واحدة في السنة، على سبيل المثال: ”0 0 1 1 *“.
@monthly   :    يُنفَّذ مرة واحدة في الشهر، على سبيل المثال: ”0 0 1 * *“.
@weekly    :    يُنفَّذ مرة واحدة في الأسبوع، أي ”0 0 * * 0“.
@daily     :    يُنفَّذ مرة واحدة في اليوم، أي ”0 0 * * *“.
@hourly    :    يُنفَّذ مرة واحدة في الساعة، أي ”0 * * * *“.

تحذيرات
 crontab يجب أن تكون ملفات عادية أو روابط رمزية لملفات عادية، ويجب ألا تكون قابلة للتنفيذ أو الكتابة لأي شخص غير المالك. يمكن تجاوز هذا المطلب باستخدام الخيار -p في سطر أوامر crond. إذا كانت دعم inotify قيد الاستخدام، فإن التغييرات في crontabs المرتبطة رمزياً لا يتم ملاحظتها آلياً بواسطة برنامج cron الخفي. يجب أن يستقبل برنامج cron الخفي إشارة SIGHUP لإعادة تحميل crontabs. هذا قيد من واجهة برمجة تطبيقات inotify.

يتطلب cron أن ينتهي كل إدخال في crontab بحرف سطر جديد. إذا كان الإدخال الأخير في crontab يفتقر إلى سطر جديد (أي ينتهي بـ EOF)، فسيعتبر cron أن crontab معطل (جزئيًا على الأقل). يُكتب تحذير إلى syslog.

المؤلف
Paul Vixie (vixie@isc.org)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.