English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

أمر crontab في Linux

مجمع الأوامر في لينكس

يُستخدم crontab في Linux لتنفيذ البرامج بشكل دوري.

بعد تثبيت نظام التشغيل، يتم تشغيل الأمر المخطط مسبقًا بشكل افتراضي.

يقوم الأمر crond بفحص بانتظام كل دقيقة ما إذا كان هناك عمل يتعين تنفيذه، ويقوم بتنفيذ العمل تلقائيًا إذا كان موجودًا.

ملاحظة:الوظائف الجديدة التي يتم إنشاؤها في cron لن تنفذ على الفور،بل يجب أن تمر على الأقل 2 دقيقة،بالطبع يمكنك إعادة تشغيل cron للتنفيذ الفوري.

ويعمل تنظيم المهام في Linux بشكل رئيسي في فئتين:

  • 1. العمل النظامي: العمل الذي يقوم به النظام بانتظام،مثل إجراء نسخ احتياطية للبيانات النظامية،وإزالة المخزون.
  • 2. العمل الشخصي: العمل الذي يقوم به المستخدم بانتظام،مثل فحص خادم البريد الإلكتروني كل 10 دقائق لمعرفة ما إذا كان هناك بريد إلكتروني جديد،يمكن لهذه الأعمال إعدادها من قبل كل مستخدم.

القواعد النحوية

crontab [ -u user ] file

أو

crontab [ -u user ] { -l | -r | -e }

شرح:

crontab يُستخدم لتمكين المستخدمين من تنفيذ البرامج في أوقات محددة أو في فترات زمنية محددة،بمعنى آخر،هو جدول الزمني للمستخدم.

-u user يشير إلى تعيين جدول الزمني للمستخدم المحدد،هذا يتطلب أن يكون لديك صلاحيات المستخدم (مثل root) لتعيين جدول الزمني للآخرين. إذا لم تستخدم -u user،فسيكون ذلك يعني تعيين جدول الزمني الخاص بك.

شرح المعلمات:

  • -e : تنفيذ محرر النصوص لضبط الجدول الزمني،المحرر الافتراضي هو VI،إذا كنت ترغب في استخدام محرر نصوص آخر،فيرجى إعداد متغير البيئة VISUAL لتعيين استخدام ذلك المحرر (مثل setenv VISUAL joe)
  • -r : حذف الجدول الزمني الحالي
  • -l : عرض الجدول الحالي للجدول الزمني

تنسيق الوقت كما يلي:

f1 f2 f3 f4 f5 program
  • حيث f1 يُمثل الدقائق،f2 يُمثل الساعات،f3 يُمثل اليوم من الشهر،f4 يُمثل الشهر،f5 يُمثل اليوم من الأسبوع. البرنامج يُمثل البرنامج الذي سيُنفذ.
  • عندما يكون f1 * يُمثل تنفيذ البرنامج كل دقيقة،f2 * يُمثل تنفيذ البرنامج كل ساعة،وما إلى ذلك
  • عندما يكون f1 a-b يُمثل تنفيذ الفترة من الدقيقة a إلى الدقيقة b،f2 a-b يُمثل تنفيذ الفترة من الساعة a إلى الساعة b،وما إلى ذلك
  • عندما يكون f1 */n يُمثل تنفيذ كل n دقيقة من الوقت،f2 */n يُمثل تنفيذ كل n ساعة من الوقت،وما إلى ذلك
  • عندما يكون f1 a, b, c,... يُمثل تنفيذ الدقائق a, b, c,...،f2 a, b, c,... يُمثل تنفيذ الساعات a, b, c,...،وما إلى ذلك
*    *    *    *    *
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- اليوم من الأسبوع (0 - 6) (الأحد هو 0)
|    |    |    +---------- الشهر (1 - 12) 
|    |    +--------------- اليوم من الشهر (1 - 31)
|    +-------------------- الساعات (0 - 23)
+------------------------- الدقائق (0 - 59)

يمكن للمستخدم أيضًا حفظ جميع الإعدادات أولاً في ملف، واستخدام طريقة crontab file لتعيين وقت التنفيذ.

مثال على الإنترنت

كل دقيقة تنفذ الأمر /bin/ls

كل دقيقة تنفذ الأمر /bin/ls

في الشهر ال12، كل يوم من الساعة 06:00 إلى الساعة 12:00، تنفذ الأمر /usr/bin/backup كل 3 ساعات في الدقيقة 00

كل 3 ساعات من الساعة 06:00 إلى الساعة 12:00 في الشهر ال12، تنفذ الأمر /usr/bin/backup

كل يوم من الإثنين إلى الجمعة في الساعة 17:00 يرسل بريدًا إلى [email protected]:

كل يوم من الإثنين إلى الجمعة في الساعة 17:00 يرسل بريدًا إلى [email protected] مع موضوع "hi" من ملف /tmp/maildata

كل يوم من كل شهر في منتصف الليل الساعة 00:20، 02:20، 04:20،... تنفذ الأمر echo "haha":

كل 2 ساعات من الساعة 20:00 إلى الساعة 23:00 في كل يوم تنفذ الأمر echo "haha"

دعونا نرى بعض الأمثلة المحددة:

كل ساعتين في الساعة 00:00 إعادة تشغيل apache 
كل يوم في الساعة 07:50 تشغيل خدمة ssh 
كل يوم في الساعة 22:50 إيقاف خدمة ssh 
كل شهر في الأول والخامس في الساعة 00:00 فحص قرص /home 
كل ساعة في الدقيقة الأولى تنفذ ملف /home/bruce/backup 
كل يوم من الإثنين إلى الجمعة الساعة 03:00، في مجلد /home، البحث عن ملفات تسمى *.xxx، وإزالة الملفات التي تكون قديمة 4 أيام.
30 6 */10 * * ls  يعني تنفيذ أمر ls مرة واحدة في الساعة 6:30 كل شهر في الـ 1، 11، 21، 31

ملاحظة:بعد تنفيذ البرنامج في الوقت المحدد الذي قمت بتحديده، سيبعث النظام برسالة بريد إلكتروني إلى المستخدم الحالي، يظهر فيها محتوى تنفيذ البرنامج، إذا لم تكن ترغب في استقبال مثل هذه الرسائل، فأضف > /dev/null 2>&1 بعد كل سطر فارغ، مثلًا:

20 03 * * * . /etc/profile;/bin/sh /var/www/w3codebox/test.sh > /dev/null 2>&1 

مشكلة عدم تنفيذ السكربت

إذا استخدمنا crontab لتشغيل سكربتات التوقيت، فإنها لا يمكن تنفيذها، ولكن إذا تم تنفيذها مباشرة عن طريق الأمر (مثل: ./test.sh) يمكن تنفيذها بشكل طبيعي، هذا بسبب عدم القدرة على قراءة متغيرات البيئة.

حل المشكلة:

  • 1-كل أمر يجب أن يكون بطريقة المسار الكامل، مثل: /usr/local/bin/docker.

  • 2-استخدام الكود التالي في بداية سكربت الشل:

    #!/bin/sh
    . /etc/profile
    . ~/.bash_profile

    3-في /etc/crontab إضافة متغيرات البيئة، قبل أمر القابلية للتنفيذ أضف الأمر . /etc/profile;/bin/sh، لجعل متغيرات البيئة تنجح، مثلًا:

    20 03 * * * . /etc/profile;/bin/sh /var/www/w3codebox/test.sh

    مجمع الأوامر في لينكس