Cron که اختصار کلمات Command Run On است، یکی از امکانات نرم افزاری کنترل پنلها میباشد. Cron Job در سیستمهای لینوکسی، ابزاری است که وظیفهی اجرای یک عملیات خاص (یک دستور، یک برنامهی خاصی و یا یک اسکریپت)، را در یک زمانبندی مشخص به صورت کاملا اتوماتیک بر عهده دارد؛ مثلا پاک کردن پوشه /tmp هر یک روز یکبار
بنابراین، با استفاده از آن میتوان بصورت اتوماتیک، کارهای روتین و تکراری را به سادگی و بدون دخالت کاربر اجرا نمود.
اما، اکنون این سوال بوجود میآید که cron jobها را چگونه میتوان در سیستم عامل لینوکس/یونیکس اضافه نمود؟
همانطور که بیان شد، Cron یکی از مفیدترین ابزارها در سیستم عاملهای لینوکس/یونیکس است و معمولاً برای فعالیتهای مربوط به sysadmin مانند پشتیبان گیری یا خالی کردن دایرکتوریهای /tmp/ و موارد دیگر استفاده میشود. سرویس cron (Daemon) در پس زمینه اجرا شده و دائما فایلهای etc/crontab/ و دایرکتوریهای /etc/cron/ را بررسی میکند. علاوه براین، دایرکتوری /var/spool/cron/ را نیز بررسی مینماید.
دستور crontab برای cron jobها
برای ویرایش/ایجاد، نصب، حذف یا لیست کردن cron jobها در Cron باید از دستور crontab استفاده کرد. هر کاربر میتواند فایل crontab خود را داشته باشد، و اگرچه این فایلها در var/spool/cron/crontabs/ قرار دارند، ولیکن نباید مستقیماً ویرایش شوند. برای ویرایش یا تنظیم cron jobهای خود باید از دستور crontab استفاده کنید.
انواع فایلهای پیکربندی cron
انواع مختلفی از فایلهای پیکربندی وجود دارد:
Crontab سیستم لینوکس/یونیکس: معمولاً توسط سرویسهای سیستم و فعالیتهای حساسی مورد استفاده قرار میگیرد؛ که به مجوزهای root نیاز دارند. قسمت ششم در این نوع crontab (در ادامه نشان داده شده است)، نام کاربر اجراکنندهی دستور را نشان میدهد. این، به crontab سیستم اجازهی اجرای دستورات را توسط هر نوع کاربری میدهد.
crontabهای کاربر: کاربر میتواند cron jobهای خود را با استفاده از دستور crontab نصب کند. در قسمت ششم در این نوع crontab، دستور مورد نظر برای اجرا مشخص میگردد و تمام دستورات به عنوان کاربر ایجاد کننده crontab اجرا میشوند.
چگونه میتوان cron jobهای خود را نصب، ایجاد یا ویرایش نمود؟
برای ویرایش یا ایجاد فایل crontab خود، دستور زیر را در ترمینال لینوکس/یونیکس تایپ کنید:
$ crontab -e
آیا بعد از تغییر فایل crontable باید Cron را مجددا راه اندازی کرد؟
خیر. Cron زمان اصلاح را در کلیه crontabها بررسی کرده و مواردی را که تغییر کرده مجددا بارگذاری مینماید. بنابراین cron هر وقت که فایل crontab اصلاح شود، نیاز به راه اندازی مجدد ندارد.
این مطلب نیز ممکن است برای شما مفید باشد: cPanel چیست؟
ساختار crontab
ساختار crontab بدین صورت است:
1 2 3 4 5 /path/to/command arg1 arg2
یا
1 2 3 4 5 /root/backup.sh
که در آن پارامترها به شرح زیر هستند.
- 1: دقیقه (0-59)
- 2: ساعت (0-23)
- 3: روز (0-31)
- 4: ماه (0-12 که 12ماه دسامبر است)
- 5: ایام هفته (0-7 که در آن 7 یا 0 روز یکشنبه است)
- path/to/command/: اسکریپت یا نام دستور برای برنامه ریزی
cron job فرمت سادهی زیر را داراست:
* * * * * command to be executed
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)
Cron job شما، برای فعالیتهای سیستم به شرح زیر است:
1 2 3 4 5 USERNAME /path/to/command arg1 arg2
یا
1 2 3 4 5 USERNAME /path/to/script.sh
در ادامه مثالهایی را از نحوه کارکردن این دستور برای شما آماده کردهایم؛ همچنین شما میتوانید با مراجعه به این سایت، در مورد نحوه زمانبندی این دستور، اطلاعات بیشتری را بدست آورد.
مثال: اجرای اسکریپت cron job مربوط به پشتیبان گیری
چنانچه بخواهید هر روز ساعت 3 صبح، یک اسکریپت با نام root/backup.sh/ را اجرا کنید، ورودی crontab شما باید به صورت زیر باشد. ابتدا با اجرای دستور زیر، cronjob خود را نصب کنید:
# crontab -e
ورودی زیر را اضافه کنید:
0 3 * * * /root/backup.sh
آن را ذخیره کرده و فایل را ببندید.
مثالهای بیشتر
برای اجرای دستور path/to/command/ هر روز پنج دقیقه بعد از نیمه شب، عبارت زیر را وارد کنید:
5 0 * * * /path/to/command
برای اجرای path/to/script.sh/ در ساعت 2:15 بعد از ظهر اول هر ماه، دستور زیر را وارد کنید:
15 14 1 * * /path/to/script.sh
برای اجرای برنامه scriptts/phpscript.php/ ساعت 10 عصر در روزهای هفته، دستور زیر را وارد کنید:
0 22 * * 1-5 /scripts/phpscript.php
برای اجرای برنامه root/scriptts/perl/perlscript.pl/ هر روز در 23 دقیقه بعد از نیمه شب، 2 صبح، 4 صبح و...، دستور زیر را وارد کنید:
23 0-23/2 * * * /root/scripts/perl/perlscript.pl
برای اجرای path/to/unixcommand/ یکشنبه ها 5 دقیقه بعد از ساعت 4، دستور زیر را وارد کنید:
5 4 * * sun /path/to/unixcommand
چگونه میتوان از عملگرها استفاده کرد؟
یک عملگر به شما اجازه میدهد، مقادیر مختلفی را در یک زمینه مشخص کنید. سه عملگر وجود دارد:
ستاره (*): این عملگر، تمام مقادیر ممکن را برای یک فیلد مشخص میکند. به عنوان مثال، یک ستاره در فیلد زمان مربوط به ساعت، معادل هر ساعت و ستاره در فیلد ماه، معادل هر ماه خواهد بود.
کاما (،): این عملگر، لیستی از مقادیر را مشخص میکند، به عنوان مثال: “1,5,10,15,20,25”
خط تیره (-): این عملگر، طیف وسیعی از مقادیر را مشخص میکند، به عنوان مثال: "51-5" روز، معادل تایپ کردن "5,6,7,8,9,...,10,11,12,13,14,15" با استفاده از عملگر کاما است.
جداکننده (/): این عملگر مقدار مرحله را مشخص میکند، به عنوان مثال: "/23-0" را میتوان در فیلد ساعتها، برای مشخص کردن اجرای دستور در هر ساعت دیگر استفاده کرد. مراحل بعد از ستاره نیز مجاز هستند، بنابراین اگر میخواهید بگویید هر دو ساعت یکبار، کافیست از 2/* استفاده کنید.
غیرفعال کردن ارسال خروجی به ایمیل
به طور پیش فرض، خروجی یک دستور یا یک اسکریپت (در صورت داشتن خروجی)، به حساب ایمیل محلی شما ارسال خواهد شد. برای متوقف کردن دریافت ایمیل از خروجی crontab، باید عبارت dev/null 2>&1/< را به دستور اضافه نمایید. مثلا:
0 3 * * * /root/backup.sh >/dev/null 2>&1
برای ارسال خروجی، به یک حساب ایمیل خاص؛ به عنون مثال vivek@nixcraft.in، شما باید متغیر MAILTO را به صورت زیر تعریف کنید:
MAILTO="vivek@nixcraft.in"
0 3 * * * /root/backup.sh >/dev/null 2>&1
لیست کردن همه cron jobهای سیستم
دستور زیر را تایپ کنید:
# crontab -l
# crontab -u username -l
برای حذف یا پاک کردن تمام عملیاتهای crontab، از دستور زیر استفاده کنید:
# Delete the current cron jobs #
crontab -r
## Delete job for specific user. Must be run as root user ##
crontab -r -u username
استفاده از رشتههای ویژه برای صرفه جویی در وقت
به جای پنج فیلد اول، میتوانید از هر یک از هشت رشته ویژه استفاده کنید. این، تنها باعث صرفه جویی در وقت شما نمیشود؛ بلکه باعث بهبود خوانایی نیز میگردد.
Meaning | Special string |
---|---|
Run once, at startup. | @reboot |
Run once a year, “0 0 1 1 *”. | @yearly |
(same as @yearly) | @annually |
Run once a month, “0 0 1 * *”. | @monthly |
Run once a week, “0 0 * * 0”. | @weekly |
Run once a day, “0 0 * * *”. | @daily |
(same as @daily) | @midnight |
Run once an hour, “0 * * * *”. | @hourly |
مثالها
اجرای دستور ntpdate در هر ساعت:
@hourly /path/to/ntpdate
گرفتن یک نسخه پشتیبان در هر روز:
@daily /path/to/backup/script.sh
منبع:
من از cron برای حذف cache استفاده کردم، دستور زیر را هم در crontab اضافه کردم اما عمل نمیکنه، لطفا راهنمایی کنید
1 * * * * echo 1 > /proc/sys/vm/drop_caches
جدای از اینکه به چه دلیل به خالی کردن کش های مموری نیاز پیدا کردید، منظور شما از «عمل نمیکنه» چه چیزی هست؟
چه مراحلی رو برای افزودن این دستور به cronjob های سیستم طی کردید؟