سرور مجازی و استفاده از Cron برای خودکارسازی وظایف

سرور مجازی CentOSUbuntu

 

مقدمه

یکی از استانداردترین روش‌ها برای اجرای وظایف در پس زمینه در سرور مجازی های لینوکس، اجرا با وظایف cron است. آن‌ها برای زمان بندی وظایف در سرور مجازی و خودکارسازی وظایف مختلف مربوط به نگهداری، سودمند هستند. خود “cron”، یک daemon (یا برنامه) است که در پس زمینه اجرا می‌شود. زمان بندی برای وظایف مختلفی که در یک ساختار اجرا می‌شوند، “crontab” نام دارد.

نصب

تقریبا تمام توزیع‌های لینوکس، دارای نوعی از cron نصب شده به صورت پیش فرض هستند. با این حال، اگر شما سیستمی‌را به کار می‌برید که cron روی آن نصب نشده است، می‌توانید با دستورات زیر آن را نصب کنید:
برای Ubuntu/Debian:
sudo apt-get update
sudo apt-get install cron

برای Cent OS/Red Hat Linux:
sudo yum update
sudo yum install vixie-cron crontabs
باید مطمئن شوید که آن در پس زمینه نیز اجرا می‌شود:
sudo /sbin/chkconfig crond on
sudo /sbin/service crond start

دستور

در زیر یک وظیفه نمونه که می‌خواهیم اجرا کنیم، می‌آید:
5 * * * * curl http://www.google.com
دستور برای وظایف مختلفی که به دنبال جای دادن آن در crontab هستیم، ممکن است دشوار به نظر بیاید. در واقع اگر شما طرز خواندن آن را بدانید، آن مختصر بوده و تجزیه آن ساده است. هر دستور به بخش‌های زیر تقسیم می‌شود:
• زمان بندی
• دستور
دستور می‌تواند در واقع، هرگونه دستوری باشد که می‌خواهید به طور معمول در خط دستور اجرا کنید. قسمت زمان بندی دستور، به پنج گزینه مختلف برای زمان بندی به ترتیب زیر تقسیم می‌شود:
• دقیقه
• ساعت
• روز از ماه
• ماه
• روز از هفته

 

مثال‌ها

در این جا فهرستی از مثال‌ها برای چند زمان بندی‌های متداول که ممکن است در طول سازماندهی cron با آن مواجه شوید، آورده می‌شود.

برای اجرای یک دستور در هر دقیقه:

* * * * *

برای اجرای یک دستور در 12مین دقیقه از ساعت:

12 * * * *

شما می‌توانید گزینه‌های مختلفی را برای هر نشانه ای که بعدا با کلمه پر می‌شود، به کار ببرید. برای اجرای یک دستور، هر 15 دقیقه یکبار:

0,15,30,45 * * * *

برای اجرای یک دستور، به صورت روزانه در ساعت 4:00 قبل از ظهر، می‌توانید دستور زیر را به کار ببرید:

0 4 * * *

برای اجرای یک دستور، هر سه شنبه در ساعت 4:00 قبل از ظهر، می‌توانید دستور زیر را به کار ببرید:

0 4 * * 2

می‌توانید از تقسیم بندی در زمان بندیتان استفاده کنید. به جای فهرست کردن 0، 15، 30، 45، می‌توانید دستور زیر را به کار ببرید:

*/4 2-6 * * *

به بازه “2-6”دقت شود. این ترکیب، دستور را بین ساعت 2:00 قبل از ظهر و 6:00 قبل از ظهر اجرا خواهد کرد.

دستور زمان بندی به طرز اعجاب آوری قدرتمند و انعطاف پذیر است. شما می‌توانید هر زمانی را که تصور می‌کنید، بیان کنید.

 

ساختار

زمانی که یک زمان بندی را تعیین کرده اید و وظیفه ای را که می‌خواهید اجرا کنید، می‌دانید، باید مکانی برای قرار دادن آن داشته باشید، به طوری که daemon شما، قادر به خواندن آن باشد. چند مکان مختلف وجود دارد، اما متداول ترین مکان، crontab کاربر است. اگر شما فراخوانی کنید، آن فایل زمان بندی وظایفی را که cron اجرا خواهد کرد، تعیین می‌کند. فایل‌های هر کاربر در /var/spool/cron/crontabقرار دارد، اما آن‌ها را نمی‌توان مستقیما ویرایش کرد. بلکه استفاده از دستور crontab بهترین روش است.

شما می‌توانید crontab خود را با دستور زیر ویرایش کنید:

crontab -e

این یک ویرایشگر متن را باز می‌کند که در آن می‌توانید زمان بندی خود را برای هر وظیفه در یک خط جدید، وارد کنید.

اگر بخواهید crontab خود را ببینید، اما به دنبال ویرایش آن نیستید، می‌توانید دستور زیر را به کار ببرید:

crontab -l

شما می‌توانید crontab خود را با دستور زیر پاک کنید:

crontab -r

اگر شما یک کاربر دارای اجازه هستید، می‌توانید crontab کاربر دیگری را با تعیین crontab -u <user> -e ویرایش کنید.

 

خروجی

 

در هر وظیفهcron که اجرا می‌شود، خروجی به نشانی ایمیل کاربر که متعلق به آن کاربر است، ایمیل خواهد شد، مگر این که به یک فایل گزارش یا /dev/null هدایت شود. اگر شما یک ساختار “MAILTO” در راس crontab ارائه کنید، نشانی ایمیل می‌تواند به صورت دستی مشخص شود. شما می‌توانید برنامه خروجی را که می‌خواهید اجرا کنید، مسیری که در آن جستجو برای دودویی cron انجام می‌شود و راهنمای خانه را نیز با مثال زیر مشخص کنید:
ابتدا، بیایید crontab را ویرایش کنیم:
crontab -e
سپس، آن را به این ترتیب، ویرایش خواهیم کرد:
SHELL=/bin/bash
HOME=/
MAILTO=”[email protected]
#This is a comment
* * * * * echo ‘Run this command every minute’
این وظیفه مشخص، “این دستور را هر دقیقه اجرا کن” را به عنوان خروجی خواهد داد. این خروجی هر دقیقه به نشانی ایمیل [email protected]که من مشخص کردم، ارسال خواهد شد. بدیهی است که این نمی‌تواند یک وضعیت ایده آل باشد. همان طور که گفته شد، می‌توانیم خروجی را به یک فایل گزارش یا یک مکان خالی بفرستیم تا از ارسال خروجی با ایمیل جلوگیری کنیم.
افزودن یک فایل گزارش، به این سادگی است:
* * * * * echo ‘Run this command every minute’ >> file.log
دقت شود که: “>>” به یک فایل اضافه می‌شود.
اگر شما بخواهید آن را به یک فضای خالی بفرستید، از /dev/null استفاده کنید. در این جا یک الگوی PHP آورده می‌شود که در پس زمینه اعمال و اجرا می‌گردد.
* * * * * /usr/bin/php /var/www/domain.com/backup.php > /dev/null 2>&1

محدود کردن دسترسی

محدود کردن دسترسی به cron با فایل‌های /etc/cron.allow و /etc/cron.deny ساده است. برای اجازه دادن یا ردکردن دسترسی یک کاربر، تنها لازم است نام کاربری آن‌ها را بسته به دسترسی لازم، در یکی از فایل‌های زیر قرار دهید. به طور پیش فرض، اغلب daemonهای cron، فرض می‌کنند که کاربران به cron دسترسی دارند، مگر این که یکی از این فایل‌ها وجود داشته باشد. برای رد کردن دسترسی تمام کاربران و دادن امکان دسترسی به یک کاربر مشخص، می‌توانید مجموعه دستورات زیر را به کار ببرید:
echo ALL >>/etc/cron.deny
echo tdurden >>/etc/cron.allow
ابتدا تمام کاربران را با افزودن “ALL” به فایل رد، قفل می‌کنیم. سپس، با افزودن نام کاربری به فایل اجازه، دسترسی کاربر برای اجرای وظایف cronرا ممکن می‌سازیم.

دستورات خاص

 

چند دستور مختصرنویسی وجود دارد که می‌توانید در فایل crontab خود از آن‌ها استفاده کنید تا مدیریت را کمی‌ساده تر نمایید. آن‌ها میانبرهای مهمی‌برای مشخص کردن زمان بندی عددی معادل هستند:
• @hourly مختصرنویسی برای 0 * * * *
• @dailyمختصرنویسی برای0 0 * * *
• @weekly مختصرنویسی برای 0 0 * * 0
• @monthlyمختصرنویسی برای0 0 1 * *
• @yearlyمختصرنویسی برای0 0 1 1 *
و @reboot که دستور را در هنگام راه اندازی مجدد اجرا می‌کند.
دقت: تمام daemonهای cron نمی‌توانند با این ترکیب، تجزیه کنند (مخصوصا نسخه‌های قدیمی)، بنابراین قبل از این که به آن اطمینان کنید، مجددابررسی کنید تا از کار آن اطمینان حاصل نمایید.
برای داشتن وظیفه ای که در راه اندازی مجدد اجرا می‌شود، می‌توانید فایل crontab خود را ویرایش کنید (crontab -e) و در فایل، یک خط دستور مشابه زیر قرار دهید:
@reboot echo “System start up”
این دستور خاص، می‌تواند اجرا شود و سپس به کاربر تعیین شده در crontab ارسال شود.

 

منبع

ترجمه شده توسط : بابک طهماسبی


دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *