Train

PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : انجام خودکار کارها در لینوکس - Cron


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 های موجود آشنا بشید.

WAHID
10-30-2010, 07:02 PM
آشنایی با Cron – سطح پیشرفته
در قسمت قبل تا حدودی با این برنامه مفید آشنا شدیم حالا در این قسمت سعی می کنیم به نگفته های دیگه در مورد این برنامه بپردازیم.
فایل پیکربندی اصلی این برنامه crontab هست که در مسیر etc/ قرار داره و در حالت پیش فرض محتویاتش به قرار زیر هستن:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/



متغیر Shell برای مشخص کردن پوسته ای هست که cron برای اجرا شدن از اون استفاده می کنه و اگر این متغیر مقدار دهی نشه به طور اتوماتیک از پوسته ای که در فایل etc/passwd/ برای کاربر صاحب فایل cron مشخص شده استفاده می کنه.
متغیر Path برای مشخص کردن مسیر هایی به کار می ره که قرار هست برنامه ی مورد نظر ما از اون محل اجرا بشه. به عبارت ساده تر مسیری هست که Cron برای اجرای دستورات اون رو می گرده. که می شه برای امنیت, مسیر ها رو محدود کرد یا برای استفاده از برنامه های خودمون یا برنامه هایی که در مسیر های دیگه قرار دارن مسیر جدیدی رو بهش اضافه کرد.
در حالت معمول Cron خروجی دستورات اجرا شده رو −در صورت وجود− به وسیله پست الکترونیکی به کاربر می فرسته. اگر هیچ mail سروری نصب ندارین می تونین این متغیر رو برابر نام کاربر مورد نظر قرار بدین تا یک ایمیل داخل سیستمی براش ارسال بشه. در صورتی که این متغیر مقدار دهی نشه خروجی ها به کاربر صاحب پردازش Cron فرستاده می شن. لازم به ذکر هست که نامه های الکترونیکی که به کاربر فرستاده می شن در یک فایل همنام نام کاربری کاربر مورد نظر در مسیری مانند var/spool/mail/ ذخیره می شن. اگر می خواهید ارسال ایمیل رو غیر فعال کنید مقدار اون رو برابر یک رشته خالی قرار بدین.
متغیر HOME هم برای مشخص کردن مسیر home مورد استفاده Cron به کار می ره. و مطابق عادت Cron اگر مقدارش مشخص نشه مقدار پیش فرض رو از فایل etc/passwd/ و خط مربوط به کاربر مالک Cron بر می داره.


خوب در قسمت قبل گفتیم که هر خط فایل Cron از شش فیلد تشکیل شده در این قسمت اضافه می کنم که برای زمان بندی هایی که به طور مستقیم داخل فایل crontab ذخیره می شن یک فیلد به نام user جهت کنترل هر چه بهتر Cron اضافه می شود که وظیفه این فیلد همین طور که از اسمش پیداست برای مشخص کردن کاربری که قرار هست دستور توسط اون اجرا می شه به کار می ره. البته در صورت استفاده از فایل crontab برای زمانیندی به ترتیب فیلد ها توجه داشته باشید:
minute hour dom month dow user command
Cron یک برنامه چند کاربره هست یعنی اینکه هر کاربر می تونه فایل cron خودش رو مدیریت کنه و نسبت به ویرایش, حذف و یا ایجاد اون اقدام کنه. فایلcron در سیستم عامل های متفاوت در مسیر های مختلفی قرار می گیره برای مثال این فایل در سیستم های Unix ,Slackware و BSD* در مسیر var/spool/cron/crontab/, در سیستم های RedHat در مسیر var/spool/cron/ و در سیستم های Suse در مسیر var/cron/tab/ قرار داره.
در قسمت قبل گفتیم که برای ویرایش یا ایجاد فایل cron خود از دستور crontab به همراه e option استفاده می کنیم. با استفاده از این دستور ویرایشگر مشخص شده در متغیر محلی EDITOR فایل cron مربوط به کاربر مورد نظر که یک فایل متنی ساده هست رو ایجاد و در صورت وجود اون رو برای اعمال تغییرات باز می کنه. اگر این کار برای شما خوشآیند نیست cron این امکان رو به شما می ده که با ویرایشگر دلخواه تون دستورات رو داخل یک فایل دیگه نوشته و سپس اون رو داخل فایل cron خودتون Import کنید. برای انجام این کار دستور crontab رو به همراه آدرس فایل مورد اجرا کنید تا Import انجام بشه. برای مثال:
Crontab /path/your/file/file_name
البته e تنها option موجود دستور crontab نیست این دستور option های دیگری برای کارهایی مثل دیدن محتویات فعلی فایل crontab , حذف فایل موجود و ... دارد (به ترتیب option های l و r و ....) که لیست کاملشون در فایل راهنمای این دستور موجود هست.

کنترل دسترسی به cron
از ویژگی های جالب cron امکان کنترل دسترسی جهت استفاده از cron هست. یعنی ما می تونیم مشخص کنیم که کدام کاربران اجازه استفاده از cron رو داشته باشن یا نداشته باشن. این کار با استفاده از دو فایل cron.allow و cron.deny انجام می گیره.بدین ترتیب که برای این که یک کاربر رو از استفاده از cron محروم کنیم کافی هست نام کاربری اون رو داخل فایل cron.deny قرار بدیم یا به عکس اگر در نظر داریم کاربری امکان استفاده از cron رو داشته باشه باید نام کاربری اون رو داخل فایل cron.allow قرار بدیم.
در صورتی که در نظر دارید دسترسی همه کاربران رو به cron ببندید به جای اینکه نام کاربری تک تک کاربران رو داخل فایل cron.deny اضافه کنید می تونید تنها عبارت All رو داخلش بنویسید و همچنین بر عکس.