زمان‌بندی پروسه‌ها در لینوکس - بخش دوم، cron

در بخش اول، فرمان‌های sleep و at رو توضیح دادم، و در این بخش، به معرفی cron، یکی از قدرتمندترین ابزارهای زمان‌بندی خواهم پرداخت.

Cron چیست؟

Cron یک Daemon است که وظایفی رو که از طریق دستور crontab دریافت می‌کنه، در زمان‌های مشخص‌شده اجرا می‌کنه. در واقع کار cron اینه که هر دقیقه بیدار شه و بررسی کنه که آیا در crontab کاربرهای مختلف کاری (cron-job) هست که انجام بده؟

(توجه کنید که crontab هم نام لیستی از cron-jobهاست و هم نام فرمانی که از طریق آن لیست کارها مشخص و ویرایش می‌شود.)

به عنوان مثال ممکنه یک پدر قصد داشته باشه دسترسی به اینترنت رو هر شب ساعت ۹ قطع کنه. و یا اینکه یک مدیر بخواد دسترسی به نرم‌افزارهای مسنجر رو در طی ساعات کاری برای کارمنداش غیر ممکن کنه. و یا اینکه ممکنه کسی بخواد در زمانی که جلوی سیستمش حضور نداره، یک سری از لاگ‌های سیستم روزی یک بار براش ایمیل بشه.

فایل ‭/etc/crontab‬

Cron تمام این کارها رو از طریق بررسی فایل‌های تنظیمات خاصش به نام crontabها انجام می‌ده. به این معنی که ما باید crontabها رو تنظیم کنیم تا cron محتویات اون‌ها رو بررسی و دستورات درون آن‌ها رو در زمان مشخص شده انجام بده. اولین و مرسوم‌ترین فایل تنظیمات ‭/etc/crontab‬ است. هر سطر دستور در این فایل از یک الگوی کلی به شکل زیر پیروی می‌کنه:

شکل کلی دستورات فایل crontab

دقیقه عددی بین ۰ و ۵۹، ساعت بین ۰ تا ۲۳ و روز در ماه بین ۱ تا ۳۱ می‌باشد. در مورد ماه و روز هفته هم می‌شه از سه حرف اول روز یا ماه استفاده کرد مثل: feb, jan, mon, wed و هم می‌شه از اعداد استفاده کرد. (یکشنبه: ۰، دوشنبه: ۱ تا آخر)

در هر یک از ستون‌های مربوط به زمان یکی از حالت‌های زیر ممکنه نوشته بشه:

  • * به معنی هر زمانی (مثلا گذاشتن * در ستون دقیقه یعنی تمام دقایق)
  • یک عدد
  • چند عدد که با کاما جدا شده اند. (5,7,13)
  • یک بازه (5-10)
  • یک بازه به همراه پله ( 20/2-10 = 10, 12, 14, 16, 18, 20 و 5/* یعنی 5, 10, 15, …)

به عنوان مثال دو سطر زیر رو در نظر بگیرید:

*/10  *     *  5,7,11  *    root command1
0     9-18  *  *       1-5  root command2

در سطر اول در ماه‌های می، جولای و نوامبر هر ده دقیقه command1 اجرا می‌شه. در سطر دوم هم command2 در روزهای دو‌شنبه تا جمعه و در ساعات ۹ صبج تا ۶ بعد از ظهر هر ساعت اجرا می‌شه.

run-parts:

با اینکه زمان‌بندی دستورات توسط فایل ‭/etc/crontab‬ یک کار کاملا عملی‌است، اکثر توزیع‌های لینوکس در حال حاضر از اسکریپتی به نام run-parts برای اجرای دستورات استفاده می‌کنن. به عنوان مثال یک نمونه از فایل /etc/crontab در توزیع fedora رو ببینید:

01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

درواقع کاری که اسکریپت run-parts می‌کنه اینه که اسکریپت‌های قابل اجرا رو در یک فولدر اجرا می‌کنه. مثلا اگر شما قصد داشته باشید که اسکریپتتون هفته‌ای یک بار اجرا بشه، فقط کافیه اون رو توی فولدر /etc/cron.weekly/ کپی کنید. استفاده از این روش خیلی راحته اما، دیگه امکان زمانبندی دقیق وجود نداره و طبیعتا با این‌روش نمی‌شه هر شب ساعت ۹ اینترنت رو قطع کرد و صبح وصلش کرد.

Cron برای همه:

نیازی به این نیست که برای همه‌ی دستورها از ‭/etc/crontab‬ و کاربر ریشه استفاده کرد. هر کاربر دیگه‌ای هم می‌تونه یک فایل crontab مخصوص به خودش داشته باشه و دستوراتی رو که اجازه‌ی اجراشون رو داره، به وسیله‌ی این فایل زمان‌بندی کنه. این فایل معمولا در فولدر ‭/var/spool/cron/crontab/‬ و به نام کاربر ذخیره می‌شه و فرمتش هم مثل ‭/etc/crontab‬ است با این تفاوت که ستون کاربر وجود نداره.

البته کاربرها اجازه‌ی ویرایش مستقیم فایل crontab خودشون رو ندارن و برای اینکار باید از دستور crontab -e استفاده کنن. کاربر ریشه می‌تونه تعیین کنه که کدام کاربرها حق استفاده از دستور crontab رو داشته باشن. این کار با استفاده از دو فایل ‭/etc/cron.allow‬ و ‭/etc/cron.deny‬ انجام می‌شه و همینطور که از نام فایل‌ها پیداست، اگر اسم یک کاربر در فایل ‭/etc/cron.allow‬ باشه اون کاربر اجازه‌ی دسترسی به crontab رو داره و اگر اسم کاربر در ‭/etc/cron.deny‬ باشه اون کاربر اجازه‌ی دسترسی به crontab رو نداره. البته مسلما بعد از انجام تغییرات در این فایل‌ها، باید یک بار logout و دوباره login کنید تا تغییرات اعمال بشه.

چند نکته‌:

دستوراتی که به cron می‌دین بهتره که شامل محل دقیق دستور باشه چرا که cron فقط توی شاخه‌های /usr/bin/ و /bin/ به دنبال دستورها می‌گرده.

همین‌طور معمولا خروجی استاندارد و ارورهای یک دستور رو به یک فایل redirect می‌کنن تا بعدا بشه خروجی رو دید:

15 6 * * * /usr/bin/someprog > /tmp/someprog.out 2>&1

الان زمان اون رسیده که خودتون cron رو امتحان کنید و ببینید چه کارایی ازش بر میاد.

قسمت اول: زمان‌بندی پروسه‌ها در لینوکس - بخش اول، فرمان‌های at و sleep