Product SiteDocumentation Site

9.7. زمان‌بندی وظیفه‌ها با cron و atd

cron یک فرآیند پس‌زمینه برای اجرای دستورات تکراری و زمان‌بندی شده است (هر روز، هر هفته و از این قبیل)؛ atd اما تنها یک بار برنامه را در زمان مشخص اجرا می‌کند.
در یک سیستم یونیکس، بسیاری از وظیفه‌ها برای اجرای مداوم زمان‌بندی می‌شوند:
به صورت پیش‌فرض، تمام کاربران می‌توانند برنامه‌های خود را زمان‌بندی کنند. هر کاربر فایل crontab مخصوص به خود را دارد که در آن می‌توانند برنامه‌ها را زمان‌بندی کنند. با استفاده از دستور crontab -e می‌توان آن را ویرایش کرد (محتویات آن در فایل /var/spool/cron/crontabs/user نگهداری می‌شود).
کاربر root crontab مخصوص به خود را دارد، اما می‌تواند از فایل /etc/crontab نیز استفاده کند یا فایل‌های اضافی در دایرکتوری /etc/cron.d قرار دهد. این دو گزینه آخر امکان مشخص کردن کاربر هنگام اجرای یک دستور به خصوص را بوجود می‌آورند.
بسته cron شامل چند دستور زمان‌بندی است که عبارتند از:
بسیاری بسته‌های دبیان به این سرویس وابسته هستند: با قرار دادن اسکریپت‌های نگهداری در این دایرکتوری‌ها، آن‌ها عملکرد بهینه سرویس‌ها را رقم می‌زنند.

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 پیدا کنید که فهرستی از وظایف زمان‌بندی شده را باز می‌گرداند.