CRONTAB(5)

الاسم
crontab - جداول لتشغيل cron

الوصف

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

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

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

    name = value

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

سلسلة value لا تُحلل لاستبدالات بيئية أو استبدال متغيرات أو توسيع علامة التلدة (~)، لذا أسطر مثل

    PATH=$HOME/bin:$PATH
    PATH=~/bin:/usr/bin

لن تعمل كما قد تتوقع. ولن يعمل هذا أيضًا.

    A=1
    B=2
    C=$A $B

لن يكون هناك أي استبدال للمتغيرات المعرفة في القيمة الأخيرة. ومع ذلك، مع معظم الصدف يمكنك أيضًا تجربة مثلًا:

    P=PATH=/a/b/c:$PATH
    33 22 1 2 3 eval $P && some commands

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

(ملاحظة أخرى: متغير LOGNAME يُسمى أحيانًا USER على أنظمة BSD... على هذه الأنظمة، سيُضبط USER أيضًا.)

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

تنسيق أمر cron مشابه جدًا لمعيار V7، مع عدد من الامتدادات المتوافقة مع الإصدارات الأحدث. كل سطر يحتوي على خمسة حقول للوقت والتاريخ، يتبعها أمر، يتبعها حرف سطر جديد ('\n'). يستخدم crontab النظام (/etc/crontab) نفس التنسيق، باستثناء أن اسم المستخدم للأمر يُحدد بعد حقول الوقت والتاريخ وقبل الأمر. يمكن فصل الحقول بمسافات أو علامات تبويب. الحد الأقصى المسموح به لحقل الأمر هو 998 حرفًا.

تُنفذ الأوامر بواسطة cron(8) عندما تتطابق حقول الدقيقة والساعة وشهر السنة مع الوقت الحالي، وعندما يتطابق حقل واحد على الأقل من حقلي اليوم (يوم الشهر أو يوم الأسبوع) مع الوقت الحالي (انظر “ملاحظة” أدناه). يفحص cron(8) إدخالات cron مرة كل دقيقة. حقول الوقت والتاريخ هي:
field | القيم المسموح بها
minute | 0-59
hour | 0-23
day of month | 1-31
month | 1-12 (أو أسماء، انظر أدناه)
day of week | 0-7 (0 or 7 is Sun, or use names)

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

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

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

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

يمكن استخدام الأسماء أيضًا لحقلي “الشهر” و“يوم الأسبوع”. استخدم الأحرف الثلاثة الأولى من اليوم أو الشهر المحدد (حالة الأحرف غير مهمة). أمثلة للشهر: “يناير-مارس” أو “يناير،مارس” . أمثلة ليوم الأسبوع: “الإثنين-الأربعاء” أو “الإثنين-الأربعاء”. الأسماء باللغة الإنجليزية.

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

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

بدلاً من الحقول الخمسة الأولى، قد يظهر واحد من ثمانية سلاسل خاصة:
string | المعنى
@reboot | تشغيل مرة واحدة، عند بدء التشغيل.
@yearly | تشغيل مرة واحدة في السنة، "0 0 1 1 *".
@annually | (نفس @yearly)
@monthly | تشغيل مرة واحدة في الشهر، "0 0 1 * *".
@weekly | تشغيل مرة واحدة في الأسبوع، "0 0 * * 0".
@daily | تشغيل مرة واحدة في اليوم، "0 0 * * *".
@midnight | (نفس @daily)
@hourly | تشغيل مرة واحدة في الساعة، "0 * * * *".

يرجى ملاحظة أن بدء التشغيل، فيما يتعلق بـ @reboot، هو الوقت الذي يبدأ فيه برنامج الخفي cron(8). على وجه الخصوص، قد يكون قبل بدء تشغيل بعض برامج الخفي للنظام، أو خدمات أخرى. هذا بسبب تسلسل ترتيب الإقلاع للجهاز.

مثال لملف CRON

    # use /usr/bin/sh to run commands, no matter what /etc/passwd says
    SHELL=/usr/bin/sh
    # mail any output to `paul', no matter whose crontab this is
    MAILTO=paul
    #
    # 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"
    0 */4 1 * mon   echo "run every 4th hour on the 1st and on every Monday"
    0 0 */2 * sun   echo "run at midn on every Sunday that's an uneven date"
    # Run on every second Saturday of the month
    0 4 8-14 * *    test $(date +\%u) -eq 6 && echo "2nd Saturday"
    # Same thing, efficient too:
    0 4 * * * Sat   d=$(date +e) && test $d -ge 8 -a $d -le 14 && echo "2nd Saturday"
    #Execute early the next morning following the first
    #Thursday of each month
    57 2 * * 5 case $(date +d) in 0[2-8]) echo "After 1st Thursday"; esac

جميع الأمثلة أعلاه تشغل برامج غير تفاعلية. إذا كنت ترغب في تشغيل برنامج يتفاعل مع سطح مكتب المستخدم، يجب عليك التأكد من تعيين متغير البيئة المناسب DISPLAY.

    # Execute a program and run a notification every day at 10:00 am
    0 10 * * *  $HOME/bin/program | DISPLAY=:0 notify-send "Program run" "$(cat)"

مثال لملف cron النظامي

ما يلي يسرد محتوى ملف crontab نظامي عادي. على عكس crontab الخاص بالمستخدم، يحتوي هذا الملف على حقل اسم المستخدم، كما هو مستخدم بواسطة /etc/crontab.

    # /etc/crontab: system-wide crontab
    # Unlike any other crontab you don't have to run the `crontab'
    # command to install the new version when you edit this file
    # and files in /etc/cron.d.  These files also have username fields,
    # that none of the other crontabs do.

    SHELL=/bin/sh
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # m h dom mon dow usercommand
    17 * * * *  root  cd / && run-parts --report /etc/cron.hourly
    25 6 * * *  root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
    47 6 * * 7  root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
    52 6 1 * *  root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
    #

لاحظ أن جميع المهام النظامية ستشغل، بشكل مبدئي، من الساعة 6 صباحًا إلى 7 صباحًا. في حالة الأنظمة التي لا تعمل بالطاقة خلال تلك الفترة الزمنية، سيتم تنفيذ المهام الساعية فقط ما لم يتم تغيير الإعدادات المبدئية أعلاه.

مثال آخر

في ذلك المثال، يمكن رؤية أن الأرقام يمكن أن تُسبق ببعض الأصفار، بهدف محاذاة الأعمدة.

    17  * * * *  root  cd / && run-parts --report /etc/cron.hourly
    25 16 * * *  root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
    47 06 * * 7  root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
    52 06 1 * *  root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

انظر أيضًا

cron(8), crontab(1)

الامتدادات

عند تحديد يوم الأسبوع، يُعتبر كل من اليوم 0 واليوم 7 يوم الأحد. يبدو أن BSD و AT&T يختلفان حول هذا.

يُسمح للقوائم والنطاقات بالتعايش في نفس الحقل. "1-3,7-9" سيُرفض بواسطة AT&T أو BSD cron -- فهما يريدان رؤية "1-3" أو "7,8,9" فقط.

يمكن أن تتضمن النطاقات "خطوات"، لذا "1-9/2" هو نفسه "1,3,5,7,9".

يمكن تحديد أسماء الأشهر أو أيام الأسبوع بالاسم.

يمكن تعيين متغيرات البيئة في crontab. في BSD أو AT&T، البيئة المُسلّمة للعمليات الفرعية هي أساسًا تلك من /etc/rc.

يُرسل مخرجات الأمر بالبريد إلى مالك crontab (لا يمكن لـ BSD فعل هذا)، يمكن إرسالها بالبريد إلى شخص غير مالك crontab (لا يمكن لـ SysV فعل هذا)، أو يمكن إيقاف تشغيل الميزة ولن يُرسل أي بريد على الإطلاق (لا يمكن لـ SysV فعل هذا أيضًا).

جميع أوامر “@” التي يمكن أن تظهر بدلاً من الحقول الخمسة الأولى هي امتدادات.

القيود

يعمل البرنامج الخفي cron بمنطقة زمنية محددة. لا يدعم حاليًا مناطق زمنية لكل مستخدم. جميع المهام: مهام النظام ومهام المستخدم ستُشغّل بناءً على المنطقة الزمنية المُهيأة. حتى إذا حدد مستخدم متغير البيئة TZ في crontab الخاص به، سيؤثر هذا فقط على الأوامر المنفذة في crontab، وليس على تنفيذ مهام crontab نفسها. إذا أراد شخص تحديد منطقة زمنية معينة لمهام crontab، يمكنه التحقق من التاريخ في السكريبت الفرعي، على سبيل المثال:

    # m h  dom mon dow   command

    TZ=UTC
    0 * * * * [ "$(date +\%R)" = 00:00 ] && run_some_script

يحدد POSIX أن حقلي يوم الشهر ويوم الأسبوع كلاهما يحتاجان لمطابقة الوقت الحالي إذا كان أي منهما هو *. ومع ذلك، يتحقق هذا التنفيذ فقط مما إذا كان الحرف الأول هو *. لهذا السبب يعمل "0 0 */2 * sun" كل يوم أحد يكون تاريخًا فرديًا بينما معيار POSIX سيجعله يعمل كل يوم أحد وفي كل تاريخ فردي.

لا يجعل بناء جملة crontab من الممكن تعريف جميع الفترات الممكنة التي يمكن تخيلها. على سبيل المثال، ليس من السهل تعريف آخر يوم عمل في الشهر. لتشغيل مهمة في فترة زمنية لا يمكن تعريفها باستخدام بناء جملة crontab، أفضل نهج هو جعل البرنامج نفسه يتحقق من معلومات التاريخ والوقت ويواصل التنفيذ فقط إذا تطابقت الفترة مع الفترة المطلوبة.

إذا لم يتمكن البرنامج نفسه من إجراء التحققات، فسيكون سكريبت غلاف مطلوبًا. الأدوات المفيدة التي يمكن استخدامها لتحليل التاريخ هي ncal(1) أو calendar(1). على سبيل المثال، لتشغيل برنامج في آخر سبت من كل شهر، يمكنك استخدام كود الغلاف التالي:

    0 4 * * Sat   [ "$(date +\%e)" = "$(LANG=C ncal | sed -n 's/^Sa .* \([0-9]\+\) *$/\1/p')" ] && echo "Last Saturday" && program_to_run

الطول الأقصى المسموح به لحقل الأمر هو 998 محرفاً.

الطول الموصى به يجب أن يكون أقل من 80 محرفاً، مثل السطور في ملفات المصدر المقروءة. عندما يضطر المرء لاستخدام أمر طويل، فمن الجدير إنشاء سكريبت مخصص، والذي بدوره يمكن أن يحتوي على تعليقات قيّمة.

استخدام EVAL لتغليف إعدادات البيئة المتنوعة

النصيحة التالية مقدمة بلطف من 積丹尼 Dan Jacobson:

    CONTENT_TYPE="text/plain; charset=UTF-8"
    d=eval LANG=zh_TW.UTF-8 w3m -dump
    26 22 16 1-12 * $d https://www.ptt.cc/bbs/transgender/index.html

لن يعمل بدون eval. قول

    d=LANG=zh_TW.UTF-8 w3m -dump

سيحصل على

    /bin/sh: LANG=zh_TW.UTF-8: command not found

التشخيص

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

المؤلفون

بول فيكسي <paul@vix.com>
    كتب صفحة الدليل هذه (1994).

ستيف غرينلاند <stevegr@debian.org>
    صان الحزمة (1996-2005).

خافيير فيرنانديز سانغينو بينيا <jfs@debian.org>
    صان الحزمة (2005-2014).

كريستيان كاستنر <ckk@debian.org>
    صان الحزمة (2010-2016).

جورج خزندار <georgesk@debian.org>
    صان الحزمة (2022-2024).

حقوق النسخ
حقوق النشر © 1994 بول فيكسي

وزع البرنامج بحرية، باستثناء: لا تحذف اسمي من المصدر أو التوثيق (لا تنسب عملي إليك)، حدد تغييراتك (لكي لا أُلام على عللك المحتملة)، لا تغير أو تحذف هذا التنويه. يمكن بيعه إذا قُدم المصدر القابل للبناء للمشتري. لا يتضمن هذا البرنامج أي ضمان من أي نوع، صريحًا كان أو ضمنيًا؛ استخدمه على مسؤوليتك الخاصة، وتقع مسؤولية الأضرار (إن وجدت) التي تلحق بأي شخص نتيجة استخدام هذا البرنامج بالكامل على المستخدم.

منذ عام 1994، أُجريت العديد من التعديلات على صفحة الدليل هذه، صاغها مطورو دبيان الذين صانوا cron(TM)؛ أعلاه قائمة قصيرة، ويمكن العثور على مزيد من المعلومات في ملف /usr/share/doc/cron/copyright.

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

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

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