بلاگ

آموزش ساخت Cron Job در DirectAdmin با مثال‌های کاربردی

ایجاد Cron Jobs در کنترل پنل دایرکت ادمین

در بسیاری از سایت‌ها لازم است بعضی کارها به‌صورت خودکار و در زمان مشخص انجام شوند. ارسال گزارش روزانه، اجرای اسکریپت PHP، تهیه نسخه پشتیبان، پاک‌سازی فایل‌های موقت، به‌روزرسانی اطلاعات و فراخوانی یک URL از جمله کارهایی هستند که می‌توان آن‌ها را با Cron Job زمان‌بندی کرد.

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

در این آموزش، نحوه ایجاد کرون جاب در دایرکت ادمین را مرحله‌به‌مرحله بررسی می‌کنیم. همچنین با ساختار زمان‌بندی Cron، اجرای فایل PHP، فراخوانی URL با curl و wget، ثبت خروجی در فایل Log و روش رفع خطاهای رایج آشنا خواهید شد.

آموزش ساخت Cron Job در DirectAdmin

Cron Job چیست؟

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

  • زمان اجرای دستور
  • دستور یا Command موردنظر

برای مثال، می‌توانید یک Cron Job تعریف کنید که هر شب ساعت ۲ بامداد، فایل مربوط به تهیه نسخه پشتیبان را اجرا کند. همچنین می‌توانید اجرای یک اسکریپت را به‌صورت ساعتی، هفتگی، ماهانه یا حتی هر چند دقیقه یک‌بار تنظیم کنید.

توجه داشته باشید که Cron Job فقط زمانی اجرا می‌شود که دستور، مسیر فایل و سطح دسترسی آن به‌درستی تنظیم شده باشد. به همین دلیل بهتر است پیش از ثبت نهایی، دستور موردنظر را به‌صورت دستی آزمایش کنید.

کاربرد Cron Job در هاست چیست؟

از Cron Jobs می‌توان برای خودکارسازی بسیاری از فعالیت‌های سایت و سرور استفاده کرد. برخی از کاربردهای رایج آن عبارت‌اند از:

  • اجرای زمان‌بندی‌شده فایل‌های PHP
  • ارسال ایمیل یا گزارش روزانه
  • تهیه نسخه پشتیبان از فایل‌ها یا دیتابیس
  • پاک‌سازی Cache و فایل‌های موقت
  • به‌روزرسانی قیمت، موجودی یا اطلاعات محصولات
  • همگام‌سازی اطلاعات میان دو سامانه
  • فراخوانی API یا یک آدرس اینترنتی مشخص
  • اجرای وظایف زمان‌بندی‌شده سیستم‌های مدیریت محتوا
  • حذف اطلاعات قدیمی از دیتابیس
  • بررسی دوره‌ای وضعیت یک سرویس

مراحل ساخت Cron Job در DirectAdmin

برای ایجاد Cron Job ابتدا وارد حساب کاربری خود در کنترل پنل DirectAdmin شوید. نام بعضی گزینه‌ها ممکن است با توجه به نسخه یا قالب دایرکت ادمین کمی متفاوت باشد، اما مراحل کلی یکسان است.

  1. وارد پنل دایرکت ادمین شوید.
  2. از منوی اصلی وارد بخش Advanced Features شوید.
  3. گزینه Cron Jobs را انتخاب کنید.
  4. روی دکمه Create Cron Job کلیک کنید.
  5. مقادیر Minute، Hour، Day of Month، Month و Day of Week را وارد کنید.
  6. دستور موردنظر را در کادر Command بنویسید.
  7. روی دکمه Create کلیک کنید تا Cron Job ذخیره شود.

پس از ذخیره، کرون جاب در فهرست Cron Jobs نمایش داده می‌شود. از همین بخش می‌توانید دستور ایجادشده را ویرایش یا حذف کنید.

آشنایی با بخش‌های زمان‌بندی Cron Job

زمان‌بندی Cron از پنج بخش تشکیل شده است. ترتیب این بخش‌ها اهمیت زیادی دارد و وارد کردن مقدار اشتباه ممکن است باعث شود دستور در زمان نامناسب اجرا شود.

بخش نام انگلیسی محدوده مقدار توضیح
دقیقه Minute ۰ تا ۵۹ دقیقه اجرای دستور را مشخص می‌کند.
ساعت Hour ۰ تا ۲۳ ساعت اجرای دستور را بر اساس ساعت سرور مشخص می‌کند.
روز ماه Day of Month ۱ تا ۳۱ روز موردنظر در ماه را مشخص می‌کند.
ماه Month ۱ تا ۱۲ ماه اجرای دستور را مشخص می‌کند.
روز هفته Day of Week ۰ تا ۷ روز هفته را مشخص می‌کند. معمولاً ۰ و ۷ به یکشنبه اشاره دارند.

علامت ستاره یا * به معنی «همه مقادیر» است. برای مثال، اگر بخش دقیقه روی صفر و بخش ساعت روی ستاره قرار بگیرد، دستور در ابتدای هر ساعت اجرا می‌شود.

ساختار زمان‌بندی Cron Job شامل دقیقه ساعت روز ماه و روز هفته

نمونه زمان‌بندی Cron Job

در جدول زیر تعدادی از زمان‌بندی‌های رایج Cron Job را مشاهده می‌کنید:

زمان اجرا عبارت Cron توضیح
هر دقیقه * * * * * دستور در هر دقیقه اجرا می‌شود.
هر ۵ دقیقه */5 * * * * دستور هر پنج دقیقه یک‌بار اجرا می‌شود.
هر ۱۵ دقیقه */15 * * * * دستور چهار بار در هر ساعت اجرا می‌شود.
هر ساعت 0 * * * * دستور در دقیقه صفر هر ساعت اجرا می‌شود.
هر روز ساعت ۲ بامداد 0 2 * * * دستور روزانه در ساعت ۲:۰۰ اجرا می‌شود.
هر روز ساعت ۱۲ ظهر 0 12 * * * دستور روزانه در ساعت ۱۲:۰۰ اجرا می‌شود.
هر شنبه ساعت ۳ بامداد 0 3 * * 6 دستور هفته‌ای یک‌بار در روز شنبه اجرا می‌شود.
روز اول هر ماه 0 1 1 * * دستور روز اول هر ماه، ساعت ۱ بامداد اجرا می‌شود.
هر روز در ساعت‌های زوج 0 */2 * * * دستور هر دو ساعت یک‌بار اجرا می‌شود.

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

اجرای فایل PHP و URL با Cron Job و رفع خطاهای رایج

اجرای فایل PHP با Cron Job در DirectAdmin

یکی از مهم‌ترین کاربردهای Cron Job، اجرای خودکار فایل PHP است. برای اجرای فایل PHP بهتر است از مسیر کامل PHP و مسیر کامل فایل استفاده کنید.

نمونه دستور:

/usr/local/bin/php /home/USERNAME/domains/example.com/public_html/cron.php

در این دستور باید موارد زیر را جایگزین کنید:

  • USERNAME با نام کاربری هاست
  • example.com با نام دامنه
  • cron.php با نام و مسیر واقعی فایل PHP

برای مثال، اگر نام کاربری هاست atenaclient و دامنه example.com باشد، دستور می‌تواند به شکل زیر باشد:

/usr/local/bin/php /home/atenaclient/domains/example.com/public_html/tasks/update.php

مسیر PHP در تمام سرورها یکسان نیست. مسیرهای زیر از مسیرهای متداول PHP در سرورهای لینوکسی هستند:

/usr/local/bin/php
/usr/bin/php
/usr/local/php82/bin/php
/usr/local/php83/bin/php

در صورت دسترسی به SSH، می‌توانید دستور زیر را برای پیدا کردن مسیر PHP اجرا کنید:

which php

برای مشاهده نسخه PHP نیز از دستور زیر استفاده کنید:

php -v

اگر به SSH دسترسی ندارید یا مسیر PHP را پیدا نمی‌کنید، مسیر صحیح PHP CLI را از پشتیبانی شرکت هاستینگ دریافت کنید. انتخاب نسخه اشتباه PHP می‌تواند باعث بروز خطا در اجرای اسکریپت شود.

اجرای URL با curl در Cron Job

گاهی لازم است به‌جای اجرای مستقیم فایل PHP، یک آدرس اینترنتی فراخوانی شود. برای این کار می‌توانید از دستور curl استفاده کنید.

/usr/bin/curl -fsS "https://example.com/cron.php"

گزینه‌های استفاده‌شده در این دستور باعث می‌شوند خطاهای مهم نمایش داده شوند و خروجی‌های غیرضروری کاهش پیدا کنند.

برای ذخیره نتیجه اجرا در فایل Log می‌توانید از دستور زیر استفاده کنید:

/usr/bin/curl -fsS "https://example.com/cron.php" >> /home/USERNAME/cron-curl.log 2>&1

فراخوانی URL نسبت به اجرای مستقیم فایل PHP منابع بیشتری مصرف می‌کند و به DNS، وب‌سرور، SSL و دسترسی اینترنتی وابسته است. درصورتی‌که فایل روی همان هاست قرار دارد، اجرای مستقیم فایل PHP معمولاً انتخاب مناسب‌تری است.

اجرای URL با wget در Cron Job

به‌جای curl می‌توانید از wget نیز استفاده کنید:

/usr/bin/wget -qO- "https://example.com/cron.php"

برای ذخیره خروجی در فایل Log:

/usr/bin/wget -qO- "https://example.com/cron.php" >> /home/USERNAME/cron-wget.log 2>&1

گزینه -q خروجی‌های غیرضروری را مخفی می‌کند و گزینه -O- نتیجه درخواست را به خروجی استاندارد می‌فرستد.

ثبت خروجی Cron Job در فایل Log

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

>> /home/USERNAME/cron-task.log 2>&1

نمونه کامل اجرای فایل PHP همراه با ثبت لاگ:

/usr/local/bin/php /home/USERNAME/domains/example.com/public_html/cron.php >> /home/USERNAME/cron-task.log 2>&1

در این دستور:

  • >> خروجی جدید را به انتهای فایل Log اضافه می‌کند.
  • 2>&1 خطاها را نیز در همان فایل ذخیره می‌کند.

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

جلوگیری از ارسال ایمیل‌های متعدد Cron Job

اگر Cron Job دارای خروجی باشد، ممکن است سرور نتیجه اجرای آن را به ایمیل تعریف‌شده در پنل ارسال کند. درصورتی‌که به خروجی دستور نیازی ندارید، می‌توانید آن را به /dev/null منتقل کنید:

/usr/local/bin/php /home/USERNAME/domains/example.com/public_html/cron.php >/dev/null 2>&1

بهتر است در زمان آزمایش Cron Job خروجی را مخفی نکنید. ابتدا نتیجه را در فایل Log ذخیره کنید و پس از اطمینان از اجرای صحیح، در صورت نیاز خروجی را به /dev/null منتقل کنید.

تنظیم ساعت و Timezone در Cron Job

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

برای مثال، اگر ساعت سرور بر اساس UTC تنظیم شده باشد، اجرای دستور در ساعت ۲ سرور لزوماً به معنی ساعت ۲ بامداد به وقت ایران نیست. در چنین شرایطی باید اختلاف زمانی را هنگام تنظیم Cron در نظر بگیرید.

Timezone مربوط به PHP نیز می‌تواند جدا از Timezone سیستم‌عامل تنظیم شده باشد. اگر اسکریپت PHP تاریخ یا ساعت را اشتباه ثبت می‌کند، مقدار date.timezone در تنظیمات PHP یا تنظیمات داخلی برنامه را بررسی کنید.

جلوگیری از اجرای هم‌زمان چند Cron Job

اگر اجرای یک اسکریپت بیشتر از فاصله تعیین‌شده طول بکشد، ممکن است اجرای قبلی هنوز تمام نشده باشد و نمونه جدیدی از همان Cron Job شروع شود. این اتفاق می‌تواند باعث مصرف بالای CPU، افزایش مصرف RAM، ثبت اطلاعات تکراری یا قفل شدن دیتابیس شود.

برای جلوگیری از اجرای هم‌زمان می‌توانید از دستور flock استفاده کنید:

/usr/bin/flock -n /home/USERNAME/.cron-task.lock /usr/local/bin/php /home/USERNAME/domains/example.com/public_html/cron.php

گزینه -n باعث می‌شود اگر اجرای قبلی همچنان فعال است، اجرای جدید منتظر نماند و متوقف شود.

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

چگونه Cron Job را قبل از ثبت آزمایش کنیم؟

پیش از ایجاد کرون جاب در دایرکت ادمین، بهتر است دستور موردنظر را به‌صورت دستی اجرا کنید. اگر به SSH دسترسی دارید، همان Command را در ترمینال وارد کنید و نتیجه آن را مشاهده کنید.

برای آزمایش مطمئن‌تر می‌توانید مراحل زیر را انجام دهید:

  1. مسیر کامل PHP و فایل موردنظر را بررسی کنید.
  2. دستور را به‌صورت دستی اجرا کنید.
  3. خروجی را در یک فایل Log ذخیره کنید.
  4. Cron Job را موقتاً روی اجرای هر دقیقه تنظیم کنید.
  5. دو یا سه دقیقه منتظر بمانید و فایل Log را بررسی کنید.
  6. پس از اطمینان از اجرا، زمان‌بندی اصلی را جایگزین کنید.

اجرای دائمی Cron در هر دقیقه ممکن است منابع هاست را مصرف کند. پس از پایان آزمایش، حتماً زمان‌بندی موقت را تغییر دهید.

رفع خطاهای رایج Cron Job در DirectAdmin

خطای Permission denied

این خطا نشان می‌دهد کاربر اجازه اجرای فایل یا دسترسی به مسیر موردنظر را ندارد. ابتدا سطح دسترسی فایل را بررسی کنید. برای اسکریپت‌های اجرایی معمولاً لازم است مجوز اجرا فعال باشد:

chmod 700 /home/USERNAME/script.sh

در فایل‌های PHP که از طریق PHP CLI اجرا می‌شوند، معمولاً لازم نیست خود فایل PHP اجرایی باشد؛ اما کاربر باید اجازه خواندن فایل و دسترسی به پوشه‌های مسیر را داشته باشد.

خطای Command not found

محیط Cron ممکن است متغیرهای محیطی و PATH متفاوتی نسبت به SSH داشته باشد. به همین دلیل بهتر است همیشه مسیر کامل دستورات را وارد کنید.

به‌جای:

php cron.php

از دستور زیر استفاده کنید:

/usr/local/bin/php /home/USERNAME/domains/example.com/public_html/cron.php

همین موضوع درباره curl، wget و سایر فرمان‌ها نیز صدق می‌کند.

خطای No such file or directory

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

/home/USERNAME/domains/example.com/public_html/

نام کاربری، نام دامنه، حروف بزرگ و کوچک و نام فایل را با دقت بررسی کنید.

Cron Job اجرا می‌شود اما نتیجه‌ای ندارد

در این شرایط خروجی و خطاهای دستور را در یک فایل Log ذخیره کنید:

>> /home/USERNAME/cron-debug.log 2>&1

همچنین بررسی کنید که اسکریپت موردنظر برای اجرا به اطلاعاتی مانند متغیرهای وب‌سرور، Session، Cookie یا مسیر نسبی وابسته نباشد. محیط اجرای PHP CLI با اجرای فایل از طریق مرورگر تفاوت دارد.

نسخه PHP در Cron Job اشتباه است

ممکن است سایت با PHP 8.2 اجرا شود اما دستور Cron از نسخه پیش‌فرض دیگری استفاده کند. در این حالت باید مسیر نسخه صحیح PHP را در Command قرار دهید.

نمونه:

/usr/local/php82/bin/php /home/USERNAME/domains/example.com/public_html/cron.php

مسیر دقیق نسخه‌های PHP به تنظیمات سرور بستگی دارد.

Cron Job چند بار اجرا می‌شود

ابتدا بررسی کنید دستور تکراری در فهرست Cron Jobs ثبت نشده باشد. سپس مطمئن شوید برنامه از روش زمان‌بندی دیگری مانند WP-Cron، Queue Worker یا Scheduler داخلی نیز استفاده نمی‌کند. برای جلوگیری از هم‌پوشانی اجراها می‌توانید از flock یا قفل نرم‌افزاری استفاده کنید.

نکات امنیتی ساخت Cron Job در DirectAdmin

Cron Job می‌تواند به فایل‌ها، دیتابیس و سرویس‌های مختلف دسترسی داشته باشد. بنابراین در تعریف Command نکات امنیتی زیر را رعایت کنید:

  • رمز عبور اصلی هاست یا دیتابیس را مستقیماً در Command قرار ندهید.
  • از مسیرهای کامل و مشخص استفاده کنید.
  • فایل‌های حساس را خارج از پوشه public_html نگهداری کنید.
  • سطح دسترسی فایل‌های حاوی اطلاعات حساس را محدود کنید.
  • برای فراخوانی URL از HTTPS استفاده کنید.
  • در صورت استفاده از Token، یک مقدار طولانی و غیرقابل حدس انتخاب کنید.
  • Token را در فایل‌های عمومی یا مخزن کد منتشر نکنید.
  • خروجی Cron را در مسیری ذخیره کنید که از طریق وب قابل مشاهده نباشد.
  • از اجرای دستورات دریافت‌شده مستقیم از ورودی کاربران خودداری کنید.
  • تعداد دفعات اجرای Cron را متناسب با منابع هاست تنظیم کنید.

قرار دادن رمز یا Token در URL می‌تواند باعث ثبت شدن آن در لاگ‌ها شود. در صورت امکان، اجرای مستقیم فایل PHP یا خواندن اطلاعات حساس از یک فایل محافظت‌شده انتخاب امن‌تری است.

ویرایش یا حذف Cron Job در DirectAdmin

برای مدیریت Cron Jobهای ساخته‌شده، دوباره وارد بخش Advanced Features و سپس Cron Jobs شوید. در این صفحه فهرست وظایف زمان‌بندی‌شده نمایش داده می‌شود.

از گزینه‌های موجود در مقابل هر Cron Job می‌توانید برای ویرایش زمان‌بندی، تغییر Command یا حذف کامل آن استفاده کنید. پیش از حذف یک Cron Job مطمئن شوید که سرویس یا برنامه دیگری به اجرای آن وابسته نیست.

سؤالات متداول درباره Cron Job در دایرکت ادمین

چگونه در دایرکت ادمین Cron Job بسازیم؟

پس از ورود به دایرکت ادمین، از بخش Advanced Features وارد Cron Jobs شوید. سپس Create Cron Job را انتخاب کرده، زمان اجرا و Command را وارد کنید و روی Create بزنید.

چرا Cron Job در DirectAdmin اجرا نمی‌شود؟

اشتباه بودن مسیر PHP یا فایل، نداشتن Permission، تفاوت نسخه PHP، خطای موجود در اسکریپت، زمان‌بندی اشتباه و استفاده نکردن از مسیر کامل دستورات از رایج‌ترین دلایل اجرا نشدن Cron Job هستند.

چگونه فایل PHP را با Cron Job اجرا کنیم؟

باید مسیر کامل PHP CLI و مسیر کامل فایل را در Command قرار دهید. برای مثال:

/usr/local/bin/php /home/USERNAME/domains/example.com/public_html/cron.php

چگونه Cron Job را هر پنج دقیقه اجرا کنیم؟

در قسمت Minute مقدار */5 و در چهار قسمت دیگر علامت * را قرار دهید. عبارت کامل این زمان‌بندی به شکل */5 * * * * است.

ساعت اجرای Cron Job بر چه اساسی تعیین می‌شود؟

زمان اجرای Cron Job بر اساس ساعت سیستم‌عامل سرور تعیین می‌شود. پیش از تنظیم Cron، ساعت سرور را در پنل DirectAdmin بررسی کنید.

آیا می‌توان یک URL را با Cron Job اجرا کرد؟

بله. برای فراخوانی URL می‌توانید از curl یا wget استفاده کنید. بااین‌حال، اگر فایل روی همان سرور قرار دارد، اجرای مستقیم آن با PHP CLI معمولاً وابستگی کمتری دارد.

آیا اجرای Cron Job در هر دقیقه مناسب است؟

این موضوع به نوع اسکریپت و منابع هاست بستگی دارد. اجرای وظایف سنگین در هر دقیقه ممکن است باعث افزایش مصرف CPU، RAM یا تعداد پردازش‌ها شود. برای آزمایش می‌توان موقتاً از اجرای هر دقیقه استفاده کرد، اما زمان‌بندی نهایی باید متناسب با نیاز برنامه باشد.

جمع‌بندی

با ساخت Cron Job در DirectAdmin می‌توانید بسیاری از کارهای تکراری سایت را بدون دخالت دستی اجرا کنید. برای ایجاد یک Cron Job پایدار، تنها انتخاب زمان اجرا کافی نیست و باید مسیر صحیح PHP، آدرس کامل فایل، سطح دسترسی، ساعت سرور و روش ثبت خطاها را نیز بررسی کنید.

بهتر است ابتدا Command را به‌صورت دستی آزمایش کنید، خروجی آن را در فایل Log ذخیره کنید و پس از اطمینان از اجرای صحیح، زمان‌بندی نهایی را اعمال نمایید. همچنین برای وظایف طولانی از اجرای هم‌زمان چند نمونه جلوگیری کنید و اطلاعات حساس مانند رمز عبور را مستقیماً داخل Command قرار ندهید.

درصورتی‌که برای اجرای Cron Job، انتخاب نسخه PHP یا تنظیمات هاست لینوکس با مشکل مواجه شده‌اید، می‌توانید موضوع را با پشتیبانی سرویس میزبانی خود بررسی کنید.