9.7. زمانبندی وظیفهها با cron
و atd
cron
یک فرآیند پسزمینه برای اجرای دستورات تکراری و زمانبندی شده است (هر روز، هر هفته و از این قبیل)؛ atd
اما تنها یک بار برنامه را در زمان مشخص اجرا میکند.
در یک سیستم یونیکس، بسیاری از وظیفهها برای اجرای مداوم زمانبندی میشوند:
به صورت پیشفرض، تمام کاربران میتوانند برنامههای خود را زمانبندی کنند. هر کاربر فایل crontab مخصوص به خود را دارد که در آن میتوانند برنامهها را زمانبندی کنند. با استفاده از دستور crontab -e
میتوان آن را ویرایش کرد (محتویات آن در فایل /var/spool/cron/crontabs/user
نگهداری میشود).
کاربر root crontab مخصوص به خود را دارد، اما میتواند از فایل /etc/crontab
نیز استفاده کند یا فایلهای اضافی در دایرکتوری /etc/cron.d
قرار دهد. این دو گزینه آخر امکان مشخص کردن کاربر هنگام اجرای یک دستور به خصوص را بوجود میآورند.
بسته cron شامل چند دستور زمانبندی است که عبارتند از:
برنامههای موجود در /etc/cron.hourly/
به صورت ساعتی اجرا میشوند؛
برنامههای موجود در /etc/cron.daily/
به صورت روزانه اجرا میشوند؛
برنامههای موجود در /etc/cron.weekly/
به صورت هفتگی اجرا میشوند؛
برنامههای موجود در /etc/cron.monthly/
به صورت ماهانه اجرا میشوند.
بسیاری بستههای دبیان به این سرویس وابسته هستند: با قرار دادن اسکریپتهای نگهداری در این دایرکتوریها، آنها عملکرد بهینه سرویسها را رقم میزنند.
9.7.1. قالب یک فایل crontab
هر خط جداگانه در crontab یک برنامه زمانبندی شده با شش (یا هفت) فیلد را مشخص میکند:
دقیقه (از ۰ تا ۵۹)؛
ساعت (از ۰ تا ۲۳)؛
روز در ماه (از ۱ تا ۳۱)؛
ماه (از ۱ تا ۱۲)؛
روز در هفته (از ۰ تا ۷، ۱ متناظر با دوشنبه، یکشنه نیز با ۰ یا ۷ نمایش داده میشود؛ همچنین امکان استفاده از سه حرف ابتدای هر روز به زبان انگلیسی وجود دارد، مانند 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
9.7.2. استفاده از دستور at
at
یک دستور را در زمان مشخصی از آینده اجرا میکند. زمان و تاریخ مناسب را از طریق پارامترهای خط-فرمان دریافت کرده و دستور مورد نظر جهت اجرا را از ورودی استاندارد میگیرد. دستور شروع به اجرا میکند به طوری که انگار در پوسته کنونی وارد شده باشد. at
حتی به حفظ محیط فعلی رسیدگی میکند تا در زمان اجرای دستور همین شرایط برقرار باشد. زمان با استفاده از قوانین زیر تعیین میشود: 16:12
یا 4:12pm
نشاندهنده ۰۴:۱۲ بعد از ظهر هستند. تاریخ میتواند با چندین قالب مختلف اروپایی و غربی بیان شود، از جمله DD.MM.YY
(عبارت 27.07.15
که بیانگر ۲۷ جولای ۲۰۱۵ است)، YYYY-MM-DD
(همان تاریخ که به صورت 2015-07-27
بیان میشود)، MM/DD/[CC]YY
(برای نمونه، 12/25/15
یا 12/25/2015
برابر با ۲۵ دسامبر ۲۰۱۵ خواهد بود) یا MMDD[CC]YY
(که در آن 122515
یا 12252015
بیانگر همان تاریخ قبلی هستند). بدون أن، دستور در اولین بازه زمانی تعیین شده اجرا میشود (همان روز، یا فردا اگر زمان روز فعلی گذشته باشد). همچنین میتوانید از عبارتهای “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
پیدا کنید که فهرستی از وظایف زمانبندی شده را باز میگرداند.