WAHID
09-21-2010, 11:55 AM
سلام
امروز می خوایم با برنامه ی Cron آشنا بشیم. کار این برنامه انجام خودکار برنامه ها در زمان و تاریخ خاصی هست که برای تنظیم شده. فرض کنید مدیر یک سیستم هستید باید هر روز سر ساعت ۱ از سیستم پشتیبان تهیه کنید خوب این یه کار تکراری هست (و البته خسته کننده!) یا فرض کنید سر ساعت شما پای سیستم نیستین ولی کار تهیه پشتیبان باید انجام بگیره بدون تاخیر!!!
خوب برای این گونه موارد برنامه Cron بهترین گزینه هست. این برنامه برای خودش یک دایمون (daemon) به اسم crond داره که هر دقیقه زمانبندی موجود رو چک می کنه و در صورت تطابق اون کار رو انجام میده.
زمان بندی های این برنامه در یک فایل که همنام اسم کاربری شماست در مسیر var/spool/ قرار داره. برای اضافه کردن زمان بندی های باید این فایل رو ویرایش و زمان بندی دلخواه رو بهش اضافه کنید. در حالت معمول برای باز کردن و ویرایش این فایل نیاز به سطح دسترسی ابر کاربر (superuser) دارین ولی با استفاده از دستور crontab به همراه e option می تونید بدون نیاز به سطح دسترسی ابر کاربر فایل crontab مربوط به خودتون رو باز یا ویرایش کنید. بعد از ویرایش و ذخیره این فایل زمان بندی جدید به طور خودکار مورد بررسی قرار می گیرد.
رابط های گرافیکی متعددی برای برنامه cron مثل «Gnome Schedule» و «KCron» وجود داره که کار با برنامه رو خیلی راحتتر می کنه. ولی ما در این تاپیک بدون این رابط های گرافیکی ادامه میدیم.
محتویات فایل crontab :
هر فایل crontab شامل ۶ فیلد هست که توسط کاراکتر فاصله (space) از هم جدا می شن:
fild1 fild2 fild3 fild4 fild5 fild6
fild1 برای مشخص کردن دقیقه به کار میره و بازه ی موجود براش بین ۰ الی ۵۹ هست.
fild2 برای مشخص کردن ساعت هست و بازه ی موجودش بین ۰ الی ۲۳ هست.
fild3 برای مشخص کردن روز ماه به کار میره (یعنی قصد انجام این کار رو در کدام یک از روزهای ماه دارید) که بازه ی زمانیش بین ۱ الی ۳۱ هست.
fild4 برای مشخص کردن ماه سال به کار میره و طبیعی هست که بازه ی موجودش بین ۱ الی ۱۲ باشه.
fild5 برای مشخص کردن روز هفته به مار میره و بازه ی موجودش بین ۰ الی ۶ هست که ۰ برابر با یک شنبه هست (هفته های میلادی.)
fild6 هم برای مشخص کردن کاری مورد نظر هست.
برای مثال, من قصد دارم کار تهیه پشتیبان رو هر ۱شنبه ساعت ۹ و ۲۱ دقیقه انجام بدم بنابراین فایل crontab من برای این زمانبندی به شکل زیر خواهد بود:
21 09 * * 0 cp ~/project /media/g/project
خوب لابد الان متوجه کارکرد کاراکتر * شدید ولی محض احتیاط یه بار توضیح می دم. خوب بعضی وقتا ما می خوایم یک عمل برای یک متغیر (مثل ماه) برای تمام مقادیرش انجام بشه در این صورت از مقدار * برای استفاده می کنیم. مثلا در مثال قبل من برای اینکه پشتیبان گیری هر روز ماه و هر ماه سال انجام بگیره برای این متغیر ها مقدار * دادم.
شما می تونید برای مقدار دهی از یک بازه هم استفاده کنید برای مثال برای روز هفته بازه ۰-۴ این معنی رو داره که کار مورد نظر هر ۱شنبه, ۲شنبه, ۳شنبه, ۴شنبه و ۵شنبه انجام بگیره.
یا می تونید یک مقادیر خاصی رو در نظر بگیرید. این کار با استفاده از کاراکتر , (comma) انجام می گیره. برای مثال مقادیر ۱,۲,۱۰,۲۰,۲۵,۳۰ برای روز ماه نشون دهنده ی این هست که عمل مورد نظر باید در روز های ۱,۲,۱۰,۲۰,۲۵و ۳۰ هر ماه انجام بگیره.
برای راحتی کار با مقادیر متغیر های روز هفته و ماه سال می تونید به جای استفاده از اعداد از نام اونها استفاده کنید برای مثال به جای استفاده از اعداد ۰ الی ۶ برای روز هفته می تونید از مقادیر sun mon tue wed thu fri satو به جای استفاده از اعداد ۱ الی ۱۲ برای ماه سال می تونید از مقادیر jan feb mar apr may jun jul aug sep oct nov dec استفاده کنید.
نکته: وجود کاراکتر فاصله (space) در فیلد آخر مشکلی ایجاد نخواهد کرد.
یک مشکل:
خوب با مزیت هایی که این برنامه داره یک مشکل نسبتاً بزرگ داره اون هم این هست که برای اجرای برنامه هایی که دارای GUI هستن به مشکل بر می خوره و نمی تونه برنامه رو اجرا کنه.
برای حل این مشکل ۲ روش داریم:
روش اول با استفاده از خود برنامه ایی هست که قراره اجرا بشه. البته این روش فقط برای برنامه های محدودی قابل استفاده هست. تعدادی از برنامه های دارای یک option مخصوص برای انتخاب display مورد نظر دارن. خوب ما میایم از این گزینه استفاده می کنیم و برنامه رو به همراه این option با مقدار ۰ (۱,۲ و یا هر مقدار مورد نظر) فراخوانی می کنیم. برای مثال من برای اجرای برنامه ی Transmission از این روش استفاده می کنم.
01 09 * * * transmission --display=:0
روش دوم export کردن متغیر display به همراه مقدار داخل فایل crontab هست. برای مثال قبل می تونیم از این دستور هم بدون مشکل استفاده کنیم:
01 09 * * * export DISPLAY=:0 && transmission
بحث در مورد Cron مفصل هست و توی یک تایپک و بحث نمی گنجه ولی شما می تونید با مراجعه به منوال های موجود با دیگر option های موجود آشنا بشید.
امروز می خوایم با برنامه ی Cron آشنا بشیم. کار این برنامه انجام خودکار برنامه ها در زمان و تاریخ خاصی هست که برای تنظیم شده. فرض کنید مدیر یک سیستم هستید باید هر روز سر ساعت ۱ از سیستم پشتیبان تهیه کنید خوب این یه کار تکراری هست (و البته خسته کننده!) یا فرض کنید سر ساعت شما پای سیستم نیستین ولی کار تهیه پشتیبان باید انجام بگیره بدون تاخیر!!!
خوب برای این گونه موارد برنامه Cron بهترین گزینه هست. این برنامه برای خودش یک دایمون (daemon) به اسم crond داره که هر دقیقه زمانبندی موجود رو چک می کنه و در صورت تطابق اون کار رو انجام میده.
زمان بندی های این برنامه در یک فایل که همنام اسم کاربری شماست در مسیر var/spool/ قرار داره. برای اضافه کردن زمان بندی های باید این فایل رو ویرایش و زمان بندی دلخواه رو بهش اضافه کنید. در حالت معمول برای باز کردن و ویرایش این فایل نیاز به سطح دسترسی ابر کاربر (superuser) دارین ولی با استفاده از دستور crontab به همراه e option می تونید بدون نیاز به سطح دسترسی ابر کاربر فایل crontab مربوط به خودتون رو باز یا ویرایش کنید. بعد از ویرایش و ذخیره این فایل زمان بندی جدید به طور خودکار مورد بررسی قرار می گیرد.
رابط های گرافیکی متعددی برای برنامه cron مثل «Gnome Schedule» و «KCron» وجود داره که کار با برنامه رو خیلی راحتتر می کنه. ولی ما در این تاپیک بدون این رابط های گرافیکی ادامه میدیم.
محتویات فایل crontab :
هر فایل crontab شامل ۶ فیلد هست که توسط کاراکتر فاصله (space) از هم جدا می شن:
fild1 fild2 fild3 fild4 fild5 fild6
fild1 برای مشخص کردن دقیقه به کار میره و بازه ی موجود براش بین ۰ الی ۵۹ هست.
fild2 برای مشخص کردن ساعت هست و بازه ی موجودش بین ۰ الی ۲۳ هست.
fild3 برای مشخص کردن روز ماه به کار میره (یعنی قصد انجام این کار رو در کدام یک از روزهای ماه دارید) که بازه ی زمانیش بین ۱ الی ۳۱ هست.
fild4 برای مشخص کردن ماه سال به کار میره و طبیعی هست که بازه ی موجودش بین ۱ الی ۱۲ باشه.
fild5 برای مشخص کردن روز هفته به مار میره و بازه ی موجودش بین ۰ الی ۶ هست که ۰ برابر با یک شنبه هست (هفته های میلادی.)
fild6 هم برای مشخص کردن کاری مورد نظر هست.
برای مثال, من قصد دارم کار تهیه پشتیبان رو هر ۱شنبه ساعت ۹ و ۲۱ دقیقه انجام بدم بنابراین فایل crontab من برای این زمانبندی به شکل زیر خواهد بود:
21 09 * * 0 cp ~/project /media/g/project
خوب لابد الان متوجه کارکرد کاراکتر * شدید ولی محض احتیاط یه بار توضیح می دم. خوب بعضی وقتا ما می خوایم یک عمل برای یک متغیر (مثل ماه) برای تمام مقادیرش انجام بشه در این صورت از مقدار * برای استفاده می کنیم. مثلا در مثال قبل من برای اینکه پشتیبان گیری هر روز ماه و هر ماه سال انجام بگیره برای این متغیر ها مقدار * دادم.
شما می تونید برای مقدار دهی از یک بازه هم استفاده کنید برای مثال برای روز هفته بازه ۰-۴ این معنی رو داره که کار مورد نظر هر ۱شنبه, ۲شنبه, ۳شنبه, ۴شنبه و ۵شنبه انجام بگیره.
یا می تونید یک مقادیر خاصی رو در نظر بگیرید. این کار با استفاده از کاراکتر , (comma) انجام می گیره. برای مثال مقادیر ۱,۲,۱۰,۲۰,۲۵,۳۰ برای روز ماه نشون دهنده ی این هست که عمل مورد نظر باید در روز های ۱,۲,۱۰,۲۰,۲۵و ۳۰ هر ماه انجام بگیره.
برای راحتی کار با مقادیر متغیر های روز هفته و ماه سال می تونید به جای استفاده از اعداد از نام اونها استفاده کنید برای مثال به جای استفاده از اعداد ۰ الی ۶ برای روز هفته می تونید از مقادیر sun mon tue wed thu fri satو به جای استفاده از اعداد ۱ الی ۱۲ برای ماه سال می تونید از مقادیر jan feb mar apr may jun jul aug sep oct nov dec استفاده کنید.
نکته: وجود کاراکتر فاصله (space) در فیلد آخر مشکلی ایجاد نخواهد کرد.
یک مشکل:
خوب با مزیت هایی که این برنامه داره یک مشکل نسبتاً بزرگ داره اون هم این هست که برای اجرای برنامه هایی که دارای GUI هستن به مشکل بر می خوره و نمی تونه برنامه رو اجرا کنه.
برای حل این مشکل ۲ روش داریم:
روش اول با استفاده از خود برنامه ایی هست که قراره اجرا بشه. البته این روش فقط برای برنامه های محدودی قابل استفاده هست. تعدادی از برنامه های دارای یک option مخصوص برای انتخاب display مورد نظر دارن. خوب ما میایم از این گزینه استفاده می کنیم و برنامه رو به همراه این option با مقدار ۰ (۱,۲ و یا هر مقدار مورد نظر) فراخوانی می کنیم. برای مثال من برای اجرای برنامه ی Transmission از این روش استفاده می کنم.
01 09 * * * transmission --display=:0
روش دوم export کردن متغیر display به همراه مقدار داخل فایل crontab هست. برای مثال قبل می تونیم از این دستور هم بدون مشکل استفاده کنیم:
01 09 * * * export DISPLAY=:0 && transmission
بحث در مورد Cron مفصل هست و توی یک تایپک و بحث نمی گنجه ولی شما می تونید با مراجعه به منوال های موجود با دیگر option های موجود آشنا بشید.
