9.7. جدولة المهام باستخدام cron
وatd
cron
هي الخدمة المسؤولة عن تنفيذ الأوامر المجدولة والمتكررة (يومياً، أسبوعياً، الخ)؛ أما atd
فهي الخدمة التي تعالج الأوامر التي تنفذ مرة واحدة، لكن في لحظة محددة من المستقبل.
في نظام يونكس، هناك العديد من المهام التي تستدعى بانتظام:
تدوير (rotating) السجلات؛
تحديث قاعدة بيانات البرنامج locate
؛
النسخ الاحتياطي؛
سكربتات الصيانة (مثل تنظيف الملفات المؤقتة).
افتراضياً، يستطيع جميع المستخدمون جدولة تنفيذ المهام. لكل مستخدم إذن crontab خاص به يستطيع فيه تسجيل الأوامر المجدولة. يمكن تحريره بالأمر crontab -e
(تخزن محتوياته في الملف /var/spool/cron/crontabs/user
).
يملك المستخدم الجذر crontab خاص به، لكنه يستطيع أيضاً استخدام الملف /etc/crontab
، أو كتابة ملفات crontab إضافية في المجلد /etc/cron.d
. يمتاز الحلان الأخيران بأنه يمكن فيهما تحديد هوية المستخدم التي سوف تستخدم عند تنفيذ الأوامر.
تتضمن الحزمة cron افتراضياً بعض الأوامر المجدولة التي يتم تنفيذها:
البرامج في المجلد /etc/cron.hourly/
تنفذ مرة كل ساعة؛
البرامج في /etc/cron.daily/
مرة كل يوم؛
البرامج في /etc/cron.weekly/
مرة كل أسبوع؛
البرامج في /etc/cron.monthly/
مرة كل شهر؛
تعتمد العديد من حزم دبيان على هذه الخدمة: حيث تضمن من خلال وضع سكربتات الصيانة في هذه المجلدات العمل الأمثل لخدماتها.
كل سطر فعلي من ملف crontab يصف أمراً مجدولاً باستخدام الحقول الستة (أو السبعة) التالية:
قيمة للدقائق (عدد يتراوح بين 0 و 59)؛
قيمة للساعات (عدد يتراوح بين 0 و 23)؛
قيمة لتاريخ اليوم من الشهر (من 1 إلى 31)؛
قيمة للشهر (من 1 حتى 12)؛
قيمة للنهار من الأسبوع (من 0 إلى 7، 1 يرمز لنهار الإثنين، ويرمز لنهار الأحد بالرقم 0 والرقم 7؛ من الممكن أيضاً استخدام الحروف الثلاثة الأولى من اسم اليوم بالإنكليزية، مثل Sun
، أو Mon
، الخ)؛
اسم المستخدم الذي ستنفذ الأوامر تحت هويته (في الملف /etc/crontab
وفي الملفات المجزئة في المجلد /etc/cron.d/
، لكن ليس في ملفات crontab الخاصة بالمستخدمين)؛
الأمر المراد تنفيذه (عند تحقق الشروط المعرفة في الحقول الخمسة الأولى).
كل هذه التفاصيل موثقة في صفحة الدليل crontab(5).
يمكن تمثيل كل قيمة بشكل قائمة من القيم الممكنة (تفصل عن بعضها بفواصل). الصيغة a-b
تمثل كل القيم الممكنة في المجال بين a
وb
. والصيغة a-b/c
فتمثل المجال نفسه ولكن بزيادة قدرها c
بين القيم (مثال: 0-10/2
يعني 0,2,4,6,8,10
). أما النجمة *
فهي محرف بديل، يمثل جميع القيم الممكنة.
مثال 9.2. عينة عن ملف crontab
#Format
#min hour day mon dow command
# Download data every night at 7:25 pm
25 19 * * * $HOME/bin/get.pl
# 8:00 am, on weekdays (Monday through Friday)
00 08 * * 1-5 $HOME/bin/dosomething
# Restart the IRC proxy after each reboot
@reboot /usr/bin/dircproxy
ينفذ at
أمراً في لحظة محددة من المستقبل. يأخذ at التاريخ والوقت المرغوبين كمتغيرات في سطر الأوامر، ويأخذ الأمر الذي يجب تنفيذه من الدخل القياسي. سوف يُنفَّذ الأمر كما لو أنه أدخل في الصدفة الحالية. حتى أن at
يهتم بالحفاظ على البيئة الحالية، لإعادة توليد الشروط نفسها عند تنفيذ الأمر. يُكتَب الوقت وفق الأشكال المعتادة: يمثل كلاً من 16:12
أو 4:12pm
الساعة 4:12 عصراً. يمكن تعريف التاريخ حسب عدة صيغ أوربية وغربية، منها DD.MM.YY
(أي أن 27.07.15
تمثل 27 يوليو 2015)، YYYY-MM-DD
(التاريخ السابق سيكتب بالشكل 2015-07-27
)، MM/DD/[CC]YY
(مثال، 12/25/15
أو 12/25/2015
سوف تمثل 25 ديسمبر 2015)، أو ببساطة MMDD[CC]YY
(بحيث يمثل 122515
أو 12252015
التاريخ 25 ديسمبر 2015 أيضاً). إذا لم يحدد التاريخ، سوف يُنفّذ الأمر فور وصول الساعة إلى الوقت المحدد (من اليوم نفسه، أو اليوم التالي إذا كانت الساعة المحددة قد مضت من ذلك اليوم). يمكنك أيضاً كتابة ”today“ أو ”tomorrow“ ببساطة.
$
at 09:00 27.07.15 <<END
>
echo "Don't forget to wish a Happy Birthday to Raphaël!" \
>
| mail lolando@debian.org
>
END
warning: commands will be executed using /bin/sh
job 31 at Mon Jul 27 09:00:00 2015
هناك صيغة بديلة تستخدم لتأجيل التنفيذ لفترة محددة: at now + number period
. يمكن أن تكون الفترة period دقائق (minutes
)، أو ساعاتٍ (hours
)، أو أياماً (days
)، أو أسابيعاً (weeks
). يبين العدد number ببساطة عدد الوحدات المذكورة التي يجب أن تنقضي قبل تنفيذ الأمر.
لإلغاء مهمة مجدولة باستخدام cron
، استدع crontab -e
ببساطة واحذف السطر الموافق في ملف crontab. أما بالنسبة لمهام at
، فالعملية بنفس السهولة تقريباً: فقط استدع atrm task-number
. يعطيك at
رقم المهمة عند جدولتها، لكن يمكنك الحصول عليه ثانية باستخدام الأمر atq
، الذي يعطي لائحة محدّثة بالمهام المجدولة.