| CRONTAB(5) | فرمتهای فایل | CRONTAB(5) |
نام (NAME)
crontab - فایلهای مورد استفاده برای زمانبندی اجرای برنامهها
توضیحات (DESCRIPTION)
یک فایل crontab حاوی دستورالعملهایی برای دیمن cron(8) به شیوه سادهشده روبهرو است: «این دستور را در این زمان و در این تاریخ اجرا کن». هر کاربر میتواند crontab مخصوص به خود را تعریف کند. دستورات تعریفشده در هر crontab با دسترسی کاربری اجرا میشوند که مالک آن crontab مشخص است. Uucp و News معمولاً crontabهای مخصوص به خود را دارند که نیاز به اجرای صریح su(1) را به عنوان بخشی از دستور cron از بین میبرد.
خطوط خالی، فاصلهها و تبهای ابتدای خط نادیده گرفته میشوند. خطوطی که اولین نویسه غیرفاصلهای آنها علامت هش (#) است، کامنت بوده و پردازش نمیشوند. توجه داشته باشید که قرار دادن کامنت در همان خط دستورات cron مجاز نیست، زیرا به عنوان بخشی از دستور در نظر گرفته میشوند. به همین ترتیب، کامنتها در همان خط تنظیمات متغیرهای محیطی نیز مجاز نیستند.
یک خط فعال در crontab یا یک تنظیم محیطی است یا یک دستور cron. یک تنظیم محیطی به صورت زیر است:
name = value
که در آن فاصلههای اطراف علامت مساوی (=) اختیاری هستند و هر فاصله غیرابتدایی بعدی در value بخشی از مقدار تخصیصیافته به name محسوب میشود. رشته value میتواند درون علامتهای نقلقول (تکی یا جفتی، اما همسان) قرار گیرد تا فاصلههای ابتدایی یا انتهایی حفظ شوند.
چندین متغیر محیطی به طور خودکار توسط دیمن cron(8) تنظیم میشوند. SHELL بر روی /bin/sh تنظیم میشود، و LOGNAME و HOME از خط مربوط به مالک crontab در /etc/passwd مقداردهی میشوند. HOME و SHELL میتوانند توسط تنظیمات درون crontab بازنویسی (override) شوند؛ اما LOGNAME قابل بازنویسی نیست.
(توجه: متغیر LOGNAME در سیستمهای BSD گاهی USER نامیده میشود و آن نیز به طور خودکار تنظیم میگردد).
علاوه بر LOGNAME، HOME و SHELL، دیمن cron(8) به متغیر MAILTO نگاه میکند تا در صورت نیاز به ارسال ایمیل در نتیجه اجرای هر دستور در آن crontab مشخص، از آن استفاده کند. اگر MAILTO تعریف شده باشد (و خالی نباشد)، ایمیل به نشانی مشخصشده فرستاده میشود. اگر MAILTO تعریف شده ولی خالی باشد (MAILTO="")، هیچ ایمیلی ارسال نمیشود. در غیر این صورت، ایمیل برای مالک crontab فرستاده میشود. این گزینه زمانی مفید است که تصمیم بگیرید به جای /usr/lib/sendmail از /bin/mail به عنوان ارسالکننده ایمیل خود استفاده کنید. توجه داشته باشید که /bin/mail امکان نام مستعار (aliasing) را ارائه نمیدهد و UUCP معمولاً ایمیلهای خود را نمیخواند. اگر MAILFROM تعریف شده باشد (و خالی نباشد)، به عنوان نشانی فرستنده (envelope sender) استفاده میشود؛ در غیر این صورت از نام کاربری کاربر اجراکننده استفاده خواهد شد. این متغیر همچنین از محیط فرایند crond به ارث میرسد.
(توجه: هر دو متغیر MAILFROM و MAILTO بسط داده میشوند، بنابراین تنظیم آنها مانند مثال زیر طبق انتظار کار میکند: MAILFROM=cron-$USER@cron.com که در آن $USER با کاربر سیستم جایگزین میشود).
بهطور پیشفرض، cron ایمیل را با سرآیند 'Content-Type:' با مقدار 'text/plain' و پارامتر 'charset=' تنظیمشده بر روی 'charmap/codeset' محلی (locale) که crond(8) در آن راهاندازی شده ارسال میکند؛ یعنی یا لوکال پیشفرض سیستم (اگر متغیرهای محیطی LC_* تنظیم نشده باشند) یا لوکال مشخصشده توسط متغیرهای محیطی LC_* (ببینید locale(7)). میتوان با تنظیم متغیرهای CONTENT_TYPE و CONTENT_TRANSFER_ENCODING در یک crontab با مقادیر معتبر سرآیندهای ایمیل مربوطه، از کدگذاریهای نویسهای مختلفی برای ارسال خروجی کارهای cron استفاده کرد.
متغیر CRON_TZ منطقه زمانی مشخصشده برای جدول cron را تعیین میکند. کاربر باید زمان را بر اساس منطقه زمانی مشخصشده وارد جدول کند. زمان مورد استفاده برای ثبت در فایل گزارش (log) از منطقه زمانی محلی جایی که دیمن در حال اجراست گرفته میشود.
متغیر محیطی MLS_LEVEL پشتیبانی از چندین زمینه امنیتی (security context) مجزا برای هر کار در SELinux را درون یک crontab فراهم میکند. بهطور پیشفرض، کارهای cron با زمینه امنیتی پیشفرض SELinux کاربری که فایل crontab را ایجاد کرده اجرا میشوند. هنگام استفاده از چندین سطح امنیتی و نقش، ممکن است این امر کافی نباشد، زیرا یک کاربر یکسان ممکن است در نقشها یا سطوح امنیتی متفاوتی اجرا شود. برای اطلاعات بیشتر درباره نقشها و SELinux MLS/MCS، ببینید selinux(8) و مثال crontab که در ادامه این متن آمده است. میتوانید متغیر MLS_LEVEL را با رشته زمینه امنیتی SELinux تنظیم کنید تا زمینه امنیتی SELinux خاصی که میخواهید کارها در آن اجرا شوند مشخص شود. سپس crond زمینه اجرایی کارهایی را که با مشخصات آن زمینه امنیتی خاص همخوانی دارند تنظیم میکند. برای اطلاعات بیشتر، ببینید crontab(1) گزینه -s.
متغیر RANDOM_DELAY امکان به تأخیر انداختن شروع کارها را به میزان دقایقی تصادفی با حد بالایی که توسط متغیر مشخص شده فراهم میکند. ضریب مقیاس تصادفی هنگام راهاندازی دیمن cron تعیین میشود، بنابراین در کل مدتزمان اجرای دیمن ثابت باقی میماند.
قالب یک دستور cron شبیه به استاندارد V7 است، همراه با تعدادی افزونه با سازگاری رو به بالا. هر خط دارای پنج فیلد زمان و تاریخ است که پس از آن نام کاربر (اگر این فایل crontab مربوط به سیستم باشد) و سپس یک دستور قرار میگیرد. دستورات زمانی توسط cron(8) اجرا میشوند که فیلدهای «دقیقه»، «ساعت» و «ماه سال» با زمان فعلی همخوانی داشته باشند، و حداقل یکی از دو فیلد «روز» («روز ماه» یا «روز هفته») با زمان فعلی تطابق داشته باشد (به «یادداشت» زیر نگاه کنید).
توجه داشته باشید که این بدان معناست که زمانهای ناموجود، مانند «ساعتهای گمشده» هنگام تغییر ساعت تابستانی، هرگز مطابقت نخواهند داشت و باعث میشود کارهای زمانبندیشده در «زمانهای گمشده» اجرا نشوند. به طور مشابه، زمانهایی که بیش از یک بار رخ میدهند (باز هم در زمان تغییر ساعت تابستانی) باعث میشوند کارهای منطبق دو بار اجرا شوند.
cron(8) ورودیهای cron را هر دقیقه بررسی میکند.
فیلدهای زمان و تاریخ عبارتند از:
- فیلد مقادیر
مجاز
----- --------------
دقیقه 0-59
ساعت 0-23
روز ماه 1-31
ماه 1-12 (یا نامها، پایین را ببینید)
روز هفته 0-7 (0 یا 7 یکشنبه است، یا استفاده از نامها)
یک فیلد ممکن است حاوی یک ستاره (*) باشد که همیشه به معنای «اول-آخر» (کل بازه مجاز) است.
بازههایی از اعداد مجاز هستند. بازهها دو عدد هستند که با یک خط تیره جدا شدهاند. بازه مشخصشده شامل هر دو انتها است. برای مثال، 8-11 برای ورودی «ساعتها»، اجرا در ساعتهای 8، 9، 10 و 11 را مشخص میکند. عدد اول باید کمتر یا مساوی عدد دوم باشد.
میتوان از تصادفیسازی زمان اجرا در یک بازه استفاده کرد. یک عدد تصادفی درون بازهای که به صورت دو عدد جدا شده با علامت مد (~) تعیین شده انتخاب میشود. بازه مشخصشده شامل هر دو انتها است. برای مثال، 6~15 برای ورودی «دقیقه»، یک دقیقه تصادفی در بازه 6 تا 15 را برمیگزیند. عدد تصادفی هنگام تجزیه فایل crontab انتخاب میشود. عدد اول باید کمتر یا مساوی عدد دوم باشد. میتوانید یک یا هر دو عدد تعیینکننده بازه را حذف کنید. برای مثال، ~ برای یک ورودی «دقیقه»، یک دقیقه تصادفی در بازه 0 تا 59 انتخاب میکند.
فهرستها مجاز هستند. یک فهرست مجموعهای از اعداد (یا بازهها) است که با کاما از هم جدا شدهاند. مثالها: "1,2,5,9"، "0-4,8-12".
مقادیر گام (step) را میتوان همراه با بازهها استفاده کرد. قرار دادن «/<عدد>» به دنبال یک بازه، پرشهایی به اندازه مقدار آن عدد در سراسر بازه را مشخص میکند. برای مثال، "0-23/2" میتواند در فیلد «ساعتها» برای تعیین اجرای دستور در هر دو ساعت یکبار استفاده شود (معادل آن در استاندارد V7 عبارت است از "0,2,4,6,8,10,12,14,16,18,20,22"). مقادیر گام بعد از ستاره نیز مجاز هستند، بنابراین اگر بخواهید کاری هر دو ساعت یکبار اجرا شود، میتوانید از "*/2" استفاده کنید. لطفاً توجه داشته باشید که گامها فقط در فیلدی که به آن اعمال شدهاند ارزیابی میشوند. برای مثال "*/23" در فیلد ساعتها به معنای اجرای کار در ساعت 0 و ساعت 23 در یک روز تقویمی است. برای راه حل جایگزین به بخش «نکات» در زیر مراجعه کنید.
همچنین میتوان از نامها برای فیلدهای «ماه» و «روز هفته» استفاده کرد. از سه حرف اول روز یا ماه مورد نظر استفاده کنید (بزرگی و کوچکی حروف اهمیتی ندارد). بازهها و فهرستهایی از نامها مجاز هستند. مثالها: "mon,wed,fri"، "jan-mar".
اگر UID مالک 0 (root) باشد، اولین نویسه ورودی crontab میتواند نویسه "-" باشد. این کار از نوشتن پیام syslog توسط cron درباره دستور در حال اجرا جلوگیری میکند.
فیلد «ششم» (بقیه خط) دستوری را که باید اجرا شود مشخص میکند. کل بخش دستور در خط، تا یک نویسه خط جدید یا نویسه "%"، توسط /bin/sh یا پوستهای که در متغیر SHELL فایل cron مشخص شده اجرا خواهد شد. یک نویسه "%" در دستور، مگر اینکه با یک بکاسلش (\) گریز داده شده باشد، به نویسههای خط جدید تبدیل میشود و تمام دادههای پس از اولین % به عنوان ورودی استاندارد به دستور ارسال میشوند.
یادداشت:
روز اجرای
دستور
میتواند
در دو فیلد
روبهرو
مشخص شود —
«روز ماه»،
و «روز
هفته». اگر
هر دو فیلد
محدود شده
باشند (یعنی
حاوی نویسه
"*" نباشند)،
دستور
زمانی اجرا
میشود که
هر یک از
فیلدها با
زمان فعلی
مطابقت
داشته باشد.
برای مثال:
"30 4 1,15 * 5" باعث
میشود یک
دستور در
ساعت 4:30 صبح
در روزهای
اول و
پانزدهم هر
ماه، به
علاوه هر
جمعه اجرا
شود.
نحو فایل crontab را میتوان قبل از نصب با استفاده از گزینه -T آزمایش کرد. برای جزئیات به crontab(1) مراجعه کنید.
فایل نمونه کرون (EXAMPLE CRON FILE)
# برای اجرای دستورات از /bin/sh استفاده کن، صرف نظر از آنچه در /etc/passwd آمده SHELL=/bin/sh # هر خروجی را برای `paul' ایمیل کن، صرف نظر از اینکه این crontab متعلق به چه کسی است MAILTO=paul # CRON_TZ=Japan # پنج دقیقه پس از نیمهشب، هر روز اجرا شود 5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1 # در ساعت 2:15 بعد از ظهر روز اول هر ماه اجرا شود -- خروجی برای paul ایمیل میشود 15 14 1 * * $HOME/bin/monthly # در ساعت 10 شب در روزهای کاری اجرا شود، جو را اذیت کن 0 22 * * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?% 23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday" 5 4 * * sun echo "run at 5 after 4 every sunday"
کارهای موجود در /etc/cron.d/ (JOBS IN /etc/cron.d/)
کارهای موجود در cron.d و /etc/crontab کارهای سیستمی هستند که معمولاً برای بیش از یک کاربر استفاده میشوند، بنابراین علاوه بر موارد دیگر، نام کاربری نیز مورد نیاز است. MAILTO در خط اول اختیاری است.
نمونه یک کار در /etc/cron.d/job (EXAMPLE OF A JOB IN /etc/cron.d/job)
# ورود با کاربر root # ایجاد کار با ویرایشگر دلخواه (مانند vim) MAILTO=root * * * * * root touch /tmp/file
نکات (NOTES)
همانطور که در بالا ذکر شد، مقادیر پرش فقط در بازه زمانی که به آن متصل هستند عمل میکنند. برای مثال، تعیین "0/35" برای فیلد دقیقه یک ورودی crontab باعث نمیشود که آن ورودی هر 35 دقیقه یکبار اجرا شود؛ در عوض، دو بار در هر ساعت، در دقایق 0 و 35 اجرا خواهد شد. برای کنترل دقیقتر میتوانید کاری شبیه به این انجام دهید:
* * * * * if [ $(expr \( $(date +%s) / 60 \) % 58) = 0 ]; then echo this runs every 58 minutes; fi 0 * * * * if [ $(expr \( $(date +%s) / 3600 \) % 23) = 0 ]; then echo this runs every 23 hours on the hour; fi
اگر دستور date(1) شما "+%s" را به عنوان مشخصکننده قالب برای خروجی برچسب زمان یونیکس نمیپذیرد، آن را بر اساس نیاز تنظیم کنید.
SELinux با امنیت چندسطحی (SELinux WITH MULTI LEVEL SECURITY - MLS)
در یک crontab،
مشخص کردن
سطح امنیتی
توسط crontab -s یا
تعیین سطح
مورد نیاز
در خط اول crontab
مهم است. هر
سطح در
/etc/selinux/targeted/seusers مشخص
میشود.
هنگام
استفاده از
crontab در حالت MLS،
بهویژه
مهم است که:
- نقش واقعی
بررسی/تغییر
داده شود،
- نقش صحیح
برای
دایرکتوریای
که برای
ورودی/خروجی
استفاده
میشود
تنظیم
گردد.
مثالی برای SELINUX MLS (EXAMPLE FOR SELINUX MLS)
# ورود با کاربر root newrole -r sysadm_r mkdir /tmp/SystemHigh chcon -l SystemHigh /tmp/SystemHigh crontab -e # نوشتن در فایل crontab MLS_LEVEL=SystemHigh 0-59 * * * * id -Z > /tmp/SystemHigh/crontest
فایلها (FILES)
/etc/crontab فایل اصلی crontab سیستم.
/var/spool/cron/ دایرکتوری برای ذخیره crontabهای تعریفشده توسط کاربران.
/etc/cron.d/ دایرکتوری برای ذخیره crontabهای سیستمی.
همچنین ببینید (SEE ALSO)
افزونهها (EXTENSIONS)
این نامهای مستعار ویژه برای تعیین زمان، که جایگزین ۵ فیلد اولیه زمان و تاریخ میشوند و با نویسه '@' شروع میشوند، پشتیبانی میشوند:
@reboot : اجرا یک بار پس از راهاندازی مجدد سیستم. @yearly : اجرا سالی یک بار، یعنی "0 0 1 1 *". @annually : اجرا سالی یک بار، یعنی "0 0 1 1 *". @monthly : اجرا ماهی یک بار، یعنی "0 0 1 * *". @weekly : اجرا هفتهای یک بار، یعنی "0 0 * * 0". @daily : اجرا روزی یک بار، یعنی "0 0 * * *". @hourly : اجرا ساعتی یک بار، یعنی "0 * * * *".
هشدارها (CAVEATS)
فایلهای crontab باید فایلهای معمولی یا پیوندهای نمادین به فایلهای معمولی باشند، و نباید برای هیچکس جز مالک قابل اجرا یا قابل نوشتن باشند. این الزام را میتوان با استفاده از گزینه -p در خط فرمان crond لغو کرد. اگر پشتیبانی inotify در حال استفاده باشد، تغییرات در crontabهایی که پیوند نمادین هستند بهطور خودکار توسط دیمن cron متوجه نخواهد شد. دیمن cron باید یک سیگنال SIGHUP دریافت کند تا crontabها را مجدداً بارگذاری کند. این یک محدودیت در رابط برنامهنویسی (API) مربوط به inotify است.
دیمن cron نیاز دارد که هر ورودی در crontab با یک نویسه خط جدید به پایان برسد. اگر آخرین ورودی در یک crontab فاقد خط جدید باشد (یعنی با EOF خاتمه یابد)، cron آن crontab را (حداقل بهطور جزئی) خراب در نظر میگیرد. یک هشدار در syslog ثبت خواهد شد.
نویسندگان (AUTHORS)
| 2012-11-22 | cronie |