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

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

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

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

فایل /etc/crontab
Cron تمام این کارها رو از طریق بررسی فایل‌های تنظیمات خاصش به نام crontabها انجام می‌ده. به این معنی که ما باید crontabها رو تنظیم کنیم تا cron محتویات اون‌ها رو بررسی و دستورات درون آن‌ها رو در زمان مشخص شده انجام بده. اولین و مرسوم‌ترین فایل تنظیمات /etc/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 رو امتحان کنید و ببینید چه کارایی ازش بر میاد.

-- برای خوندن قسمت اول این نوشته اینجا رو کلیک کنید.

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

شاید خیلی خوب می‌شد اگر ما هر زمان که نیاز داشتیم، می‌تونستیم به سیستم خودمون دسترسی پیدا کنیم و فرمان‌های لازم رو بهش بدیم؛ اما متاسفانه هیچ‌کس چنین توانایی‌ای رو نداره. مدت‌های زیادی آدم به دور از سیستم خودش است و بد نیست به جای بیکار گذاشتن سیستم در این مدت، لیست کارهایی رو که در زمان‌های مختلف باید انجام بده رو بهش بدیم و اون خودش کارها رو انجام بده. اینجوری هم ما به کار و زندگی‌مون می‌رسیم و هم سیستممون!!!

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

۱- فرمان sleep:
این فرمان کار زیادی انجام نمی‌ده و و اگر نگاهی به راهنمای اون بندازین می‌بینین که راهنمای بسیار کوتاهیه. در واقع کاری که sleep انجام می‌ده اینه که هر چقدر که ما ازش بخوایم صبر می‌کنه.
تصور کنید مشغول فیلم دیدن هستید و باید بعد از نیم ساعت سری به غذای روی گاز هم بزنید. فرمان زیر رو وارد می‌کنید و بعد از نیم ساعت سیستم به شما یادآوری می‌کنه که به گاز سر بزنید
$ (sleep 1800; notify-send "You should check the oven...\!") &

۲- فرمان at:
برای اینکه به سیستم بگیم در یک زمان خاص چند فرمان خاص رو اجرا کن، از فرمان at استفاده می‌کنیم. روش استفاده از این دستور بسیار ساده است.
به چند روش مختلف می‌شه زمان مورد نظرتون رو به این فرمان بدید. به عنوان مثال اگر قصد دارید ساعت ۳ بعد از ظهر به یکی از دوستانتون زنگ بزنید:
$ at 15:00
at> notify-send "Remember to call your friend...\!"
at> <eot>
زمانی که لیست فرمان‌هایی که قصد انجامشان را دارید تمام شد، با فشردن کلیدهای ctrl + D و یا نوشتن عبارت <eot> می‌تونید به نوشتن خاتمه دهید.
اگر قرار باشه فردا ساعت ۳ بعد از ظهر به دوستتون زنگ بزنید از فرمان زیر استفاده می‌کنید:
$ at 15:00 tomorrow
و به همین شکل اگر قرار باشه کاری رو در نیمه‌شب ۱۷ جولای انجام بدین:
$ at midnight July 17

و همین‌طور اگر می‌خواهید سال دیگه تولد دوستتون بهتون یادآوری بشه:
$ at 09:00 July 04 2011

فکر می‌کنم به خوبی متوجه شده باشید که چجوری می‌شه از فرمان at استفاده کرد. برای دیدن لیست کارهای زمان‌بندی شده می‌تونید از فرمان زیر استفاده کنید:
$ atq
البته به جای فرمان بالا از at -l هم می‌توان استفاده کرد!
همچنین اگر قصد دارید یکی از فعالیت‌ها(به عنوان مثال فعالیت شماره ۳) رو‌ پاک کنید، باید از فرمان زیر استفاده کنید:
$ atrm 3
که به جای دستور بالا می‌توان از at -r3 استفاده کرد.

منتظر پست بعد و روش‌های حرفه‌ای‌تر زمانبندی پروسه‌ها باشید.

-- برای مطالعه‌ی قسمت دوم این نوشته اینجا رو کلیک کنید.