برای زمان‌بندی کردن امور در لینوکس، از Cron استفاده می‌شود. با Cron می‌توانید دستورات یا اسکریپت‌ها را به صورت مرتب با فاصله‌ی زمانی دلخواه اجرا کنید. فایل Crontab برای زمان‌بندی اجرای دستورات می‌بایست ویرایش شود. این فایل در نگاه اول ممکن است به نظر پیچیده برسد اما با اندکی مطالعه و تمرین، استفاده از آن بسیار ساده می‌شود.

در برخی توزیعات لینوکس مثل Arch Linux، ابزار Cron به صورت پیش‌فرض نصب و قابل‌استفاده نیست و به جای آن از systemd استفاده می‌شود. در این مقاله به روش استفاده از Cronie می‌پردازیم که در اغلب توزیعات لینوکس مثل اوبونتو، گزینه‌ی پیش‌فرض است.

روش مشاهده کردن آیتم‌های Cron در لینوکس

برای نمایش موارد زمان‌بندی شده که در فایل crontab و در حساب کاربری فعلی موجود است، دستور زیر را در ترمینال لینوکس اجرا کنید:

در تصویر زیر محتویات نمونه‌ای از فایل موردبحث را مشاهده می‌کنید:

آموزش زمان‌بندی کردن امور در لینوکس با Cron و فایل Crontab

می‌توانید دستورات زمان‌بندی‌شده حساب کاربری روت را نیز با استفاده از دستور زیر که شامل sudo است، بررسی کنید:

ویرایش امور زمان‌بندی‌شده در Crontab

برای اضافه کردن امور زمان‌بندی‌شده می‌توانید از اپلیکیشن‌هایی با رابط کاربری گرافیکی استفاده کنید که نمونه‌ی محبوب آن، Gnome Schedule است. اگر قبلاً کاری را توسط Cron زمان‌بندی نکرده باشید، فایل موردبحث خالی است. برای اضافه کردن ورودی جدید، فایل را با اضافه کردن آپشن -e باز کنید.

سینتکس اضافه کردن امور زمان‌بندی شده در Crontab ساده و در مورد تمام موارد یکسان است. کد زیر سینتکس کلی است که در ادامه به پارامترهای آن می‌پردازیم:

و پارامترهای مختلف این سینتکس:

  • m: فاصله‌ی زمانی بین اجراهای دستور بر حسب دقیقه که بین ۰ تا ۵۹ است.
  • h: بخش ساعت از فاصله‌ی زمانی که بین ۰ تا ۲۳ است.
  • d یا بخش روز از فاصله‌ی زمانی که بین ۱ تا ۳۱ است.
  • mon یا ماه که تعداد ماه‌های فاصله‌ی زمانی را مشخص می‌کند و بین ۱ تا ۱۲ است.
  • dow یا روز هفته که شماره‌ی روز در هفته را مشخص می‌کند و بین ۰ تا ۶ است. عدد ۰ اولین روز هفته یعنی Sunday یا یکشنبه است.
  • بخش Command یا دستور، دستوری است که می‌بایست مرتباً و با فاصله‌ی زمانی تعریف شده اجرا شود.

به یک مثال ساده توجه کنید: فرض کنید می‌خواهید دستوری را برای بررسی کردن در حال اجرا بودن MySQL Server اجرا کنید. برای اجرای این دستور به صورت منظم و با فاصله‌ی ۱ ساعت، کد زیر را در Crontab اضافه کنید:

دستور فوق به معنی چک کردن mysql و تمام دیتابیس‌های آن سر هر ساعت است.

برای اجرای دستوری مشابه که بررسی را صرفاً در ساعت ۱ و ۴۲ دقیقه‌ی صبح و به صورت روزانه انجام می‌دهد، از دستور زیر استفاده کنید:

برای وارد کردن چند مورد، می‌توان از کاما یا ویرگول انگلیسی استفاده کرد، مثل 1,3,5 و برای مشخص کردن بازه می‌توان از خط فاصله استفاده کرد.

اما چرا در دو مثال قبلی به جای ماه و روز هفته و ... از ستاره یا * استفاده شده است؟

اگر به جای پارامتری از * استفاده کنید، دستور در تمام حالت‌های آن پارامتر اجرا می‌شود. بنابراین برای اجرا در هر روز، به جای ذکر عدد روز یا به جای استفاده از بازه به صورت 0 - 6 یا مشخص کردن شماره‌ی روزها و جدا کردن با ویرگول به صورت 0,1,2,3,4,5,6 می‌توانید صرفاً یک ستاره قرار بدهید که بسیار ساده‌تر و کوتاه‌تر است.

در Crontab هم مثل اغلب فایل‌های اسکریپت، برای اضافه کردن توضیحاتی در مورد دستورات، کافی است ابتدای خط توضیح # بزنید. این خط از کد صرفاً توضیحات اضافی است و اجرا نمی‌شود.

آخرین مورد استفاده از / است که برای وارد کردن پله‌های تغییر یک پارامتر به کار می‌رود. به عنوان مثال می‌توانید به جای وارد کردن اعداد ۰ و ۵ و ۱۰ و ۱۵ دقیقه و الی آخر، از */5  استفاده کنید که معادل هر ۵ دقیقه یک بار است.

و اما مفهوم کرون زیر را حدس بزنید:

خط فوق به این معنی است که:

فاصله‌ی زمانی شامل ۳۴ دقیقه و شامل ۳ ساعت می‌شود. تعداد روزها ۱ الی ۳۱ است و این به معنی اجرا در تمام روزهای ماه است و همین‌طور تعداد ماه‌ها ۱ الی ۱۲ است. آخرین مورد هم روز هفته است که ۰ وارد شده و این یعنی دستور موردبحث در روز یکشنبه‌ی تمام هفته‌های تمام ماه‌های سال و در ساعت ۳ و ۳۴ دقیقه اجرا می‌شود.

کدهای کوتاه برای تعریف Cronjob

در تعریف امور زمان‌بندی شده در Crontab می‌توانید از شورت‌کدها استفاده کنید تا خواندن دستورات ساده‌تر شود. به موارد زیر توجه کنید:

  • @reboot برای اجرا کردن دستور در استارت‌آپ و فقط یک مرتبه کاربرد دارد.
  • @yearly برای یک بار اجرای دستور در سال به کار می‌رود و معادل استفاده از 0 0 1 1 * است.
  • @annually نیز درست مثل @yearly است.
  • @monthly معادل یک مرتبه اجرای دستور در ماه است و به جای 0 0 1 * * استفاده می‌شود.
  • @weekly معادل یک بار اجرای دستور در هفته و عبارت 0 0 * * 0 است.
  • @daily معادل یک بار اجرای دستور در هر روز یا معادل عبارت 0 0 * * * است.
  • @midnight معادل اجرای دستور در نیمه‌ی شب یا به عبارت دیگر همان @daily است.
  • @hourly معادل اجرای دستور در هر ساعت یا عبارت 0 * * * * است.

به عنوان مثال برای اجرای دستوری در هر ساعت، می‌توانید کد زیر را در Crontab اضافه کنید:

ویرایش Crontab از یک حساب کاربری دیگر

برای ویرایش Crontab با دسترسی روت، می‌توانید از sudo قبل از وارد کردن دستورات استفاده کنید. این روش کاربرد زیادی دارد، به عنوان مثال برای نوسازی گواهی SSL که از طریق سرویس Let’s Encrypt SSL  صورت می‌گیرد، می‌توانید دستور نوسازی آن را با دسترسی روت اجرا کنید.

برای اجرای دستور از یک حساب کاربری دیگر نیز می‌توانید از آپشن -u استفاده کنید و پس از آن، نام حساب کاربری موردنظر را ذکر کنید. توجه کنید که username در کد زیر می‌بایست جایگزین شود:

به عنوان مثال اگر نام کاربر، www-data باشد، می‌بایست کد زیر را اضافه کنید:

بررسی فعالیت‌های زمان‌بندی‌شده در لینوکس

می‌توانید در زمان اجرای زمان‌بندی شده‌ی یک دستور، ارسال ایمیل به آدرس کاربر را فعال کنید. برای این کار از متغیر MAILTO استفاده می‌شود.

آموزش زمان‌بندی کردن امور در لینوکس با Cron و فایل Crontab

بنابراین کافی است عبارت MAILTO=youremail@yourdomain.com را اضافه کنید و دقت کنید که آدرس ایمیل را تغییر بدهید. این متغیر معمولاً در ابتدای صفحه‌ی Crontab دیده می‌شود اما اگر در فایل موجود نیست، می‌توانید به صورت دستی آن را اضافه کنید.

به علاوه توجه کنید که می‌توانید به جای یک آدرس ایمیل، چند آدرس ایمیل را وارد کنید و موارد را با کاما جدا کنید.

برای ارسال ایمیل به آدرسی متفاوت پس از اجرای یک دستور خاص، عبارت MAILTO=youremail@yourdomain.com جدیدی را درست قبل از دستور وارد کنید. به این ترتیب ایمیلی پس از اجرای دستورات زیر این عبارت به آدرس جدید ارسال می‌شود. در ادامه می‌توانید آدرس‌های ایمیل دیگری را برای دستورات مختلف تعریف کنید.

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

به جای ارسال ایمیل، می‌توانید خروجی را به محل دلخواه دیگری نیز ارسال کنید و این کار با سوییچ < صورت می‌گیرد.

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

برای بررسی اجرای صحیح دستورات، می‌توانید فایل گزارش یا Log را بررسی کنید که البته برای باز کردن آن به دسترسی سوپریوزر نیاز دارید.

فایل گزارش در آدرس زیر قرار دارد:

/var/log

بنابراین دستور زیر را اجرا کنید تا فایل گزارش باز شود:

و تصویر زیر محتویات یک فایل syslog است:

آموزش زمان‌بندی کردن امور در لینوکس با Cron و فایل Crontab