cPanel و WHM

ساخت کرون جاب در cPanel قدم به قدم و رفع خطاهای رایج

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

نوشته تیم فنی پیکوهاستبه روزرسانی: ۲۲ مهر ۱۴۰۵۸ دقیقه مطالعه

پاسخ کوتاه

در cPanel از بخش Advanced وارد Cron Jobs شوید، زمان بندی را با پنج فیلد دقیقه، ساعت، روز، ماه و روز هفته انتخاب کنید و دستور را با مسیر کامل php و فایل بنویسید. خروجی را به یک فایل لاگ یا dev null بفرستید تا ایمیل اضافه نیاید و اجرای آن را با لاگ بررسی کنید.

برای ساخت کرون جاب در cPanel از منوی Advanced وارد Cron Jobs شوید، زمان بندی را انتخاب کنید و در فیلد Command مسیر کامل php و فایل را بنویسید. بیشتر کرون هایی که اجرا نمی شوند به یکی از سه دلیل خراب اند: مسیر نسبی، مسیر اشتباه php یا دسترسی نادرست فایل. در ادامه همین سه مورد و چند خطای دیگر را با راه بررسی هر کدام می بینید.

کرون جاب در cPanel کجاست

بعد از ورود به cPanel در بخش Advanced گزینه Cron Jobs را باز کنید. صفحه سه قسمت اصلی دارد.

  • Cron Email: آدرسی که خروجی کرون ها به آن ایمیل می شود.
  • Add New Cron Job: فرم زمان بندی و دستور.
  • Current Cron Jobs: فهرست کرون های فعلی با امکان ویرایش و حذف.

اگر از DirectAdmin استفاده می کنید، همان امکان با نام Cron Jobs در پنل کاربر وجود دارد و فرمت زمان بندی و دستورها یکسان است.

پنج فیلد زمان بندی را چطور بخوانیم

زمان بندی کرون پنج فیلد دارد که به ترتیب دقیقه، ساعت، روز ماه، ماه و روز هفته هستند. ستاره یعنی هر مقدار، و */5 یعنی هر پنج واحد. فهرست کشویی Common Settings مقدارها را برایتان پر می کند، اما بهتر است خودتان بتوانید آنها را بخوانید.

زمان بندیمعنی
* * * * *هر دقیقه
*/5 * * * *هر پنج دقیقه
0 * * * *ابتدای هر ساعت
30 2 * * *هر شب ساعت 02:30
0 9 * * 1هر دوشنبه ساعت 09:00
0 0 1 * *اول هر ماه ساعت 00:00

ساعت اجرا طبق منطقه زمانی سرور است و ممکن است با ساعت ایران فرق کند. اگر زمان دقیق برایتان مهم است، یک بار کرون را در یک یا دو دقیقه بعد بگذارید و ببینید واقعا چه ساعتی اجرا می شود.

فایل PHP را چطور صدا بزنیم

دو راه رایج دارید. راه اول اجرای مستقیم فایل با php است و راه دوم صدا زدن آدرس فایل با wget یا curl.

/usr/local/bin/php /home/USERNAME/public_html/cron/task.php
curl -s https://example.com/cron/task.php > /dev/null

مسیر php روی هر هاست فرق می کند و /usr/local/bin/php فقط یک نمونه رایج است. برای پیدا کردن مسیر درست دو راه دارید. اگر بخش Terminal در cPanel فعال است، این دستور را بزنید:

which php

اگر Terminal ندارید، متن راهنمای زیر فرم Cron Jobs نمونه دستورهای آماده با مسیر درست همان هاست را نشان می دهد. می توانید مسیر را از همان نمونه بردارید.

اجرای مستقیم با php بهتر است، چون وب سرور و محدودیت زمان اجرای درخواست وب در آن دخالتی ندارد و آدرس فایل هم از بیرون صدا زده نمی شود. اگر از curl استفاده می کنید، فایل از بیرون در دسترس است و هر کسی که آدرس را بداند می تواند آن را اجرا کند. در این حالت یک توکن در آدرس بگذارید و فایل آن را بررسی کند.

خروجی کرون را کجا بفرستیم

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

# خروجی را دور بریزید
*/5 * * * * /usr/local/bin/php /home/USERNAME/public_html/cron/task.php > /dev/null 2>&1

# خروجی و خطا را در فایل لاگ نگه دارید
*/5 * * * * /usr/local/bin/php /home/USERNAME/public_html/cron/task.php >> /home/USERNAME/cron.log 2>&1

در مرحله ساخت و عیب یابی لاگ بهتر از /dev/null است، چون خطای PHP را هم نگه می دارد. وقتی کرون پایدار شد می توانید به /dev/null برگردید یا لاگ را گاهی خالی کنید. فایل لاگ را بیرون از public_html بسازید تا از وب در دسترس نباشد.

اگر کرون هر دقیقه اجرا می شود و خروجی را به /dev/null یا فایل نمی فرستید، در یک روز ده ها ایمیل می گیرید و ممکن است صندوق ایمیل حساب هم پر شود.

مراحل ساخت یک کرون جاب

اگر اولین بار است، این مراحل را به ترتیب انجام دهید.

  1. فایل اسکریپت را در پوشه ای مثل /home/USERNAME/cron بسازید یا آپلود کنید و اجرای دستی آن را با Terminal یا یک بار با مرورگر آزمایش کنید.
  2. در cPanel به Advanced و بعد Cron Jobs بروید و اول آدرس Cron Email را ذخیره کنید.
  3. در بخش Add New Cron Job یکی از مقدارهای Common Settings را انتخاب کنید یا پنج فیلد را دستی پر کنید.
  4. در فیلد Command دستور کامل را با مسیر php، مسیر فایل و تغییر مسیر خروجی بنویسید.
  5. روی Add New Cron Job بزنید و دستور را در فهرست Current Cron Jobs ببینید.
  6. یک تا دو دقیقه بعد لاگ را بررسی کنید. اگر خروجی نیامد، به بخش خطاها در همین مقاله بروید.

برای تغییر یا حذف یک کرون، در همان فهرست از Edit و Delete استفاده کنید. کرونی که دیگر لازم ندارید را حذف کنید، چون هر کرون فعال منابع حساب را مصرف می کند و روی سقف پردازش هاست اشتراکی حساب می شود.

ایمیل اطلاع رسانی کرون را چطور تنظیم کنیم

در همان صفحه Cron Jobs بخش Cron Email را باز کنید، آدرس ایمیل را بنویسید و Update Email را بزنید. از این به بعد خروجی هر کرونی که چیزی چاپ کند به آن آدرس می رسد. ایمیل برای کرون هایی که روزی یک بار اجرا می شوند و گزارش می دهند خوب است. برای کرون های پرتکرار خروجی را به لاگ بفرستید و ایمیل را فقط برای خطاها نگه دارید.

چرا کرون اجرا نمی شود

به ترتیب تکرار، این موارد را بررسی کنید.

  1. مسیر نسبی.: کرون از پوشه home کاربر اجرا می شود، نه از پوشه فایل. دستور php task.php پیدا نمی شود. همیشه مسیر کامل از /home/USERNAME/... بنویسید. اگر خود اسکریپت فایل دیگری را include می کند، از __DIR__ استفاده کنید.
  2. مسیر php اشتباه.: با which php یا نمونه های cPanel مسیر درست را پیدا کنید. اگر پیام command not found در لاگ یا ایمیل دیدید، همین است.
  3. دسترسی فایل.: فایل باید برای کاربر حساب قابل خواندن باشد. معمولا 644 برای فایل و 755 برای پوشه کافی است.
  4. تفاوت نسخه PHP.: نسخه php در خط فرمان ممکن است با نسخه ای که برای سایت در MultiPHP Manager انتخاب کرده اید فرق داشته باشد. اگر اسکریپت با نسخه ای دیگر خطا می دهد، مسیر php همان نسخه را مستقیم بنویسید. راهنمای تنظیم نسخه PHP و memory limit توضیح داده نسخه و محدودیت ها را از کجا ببینید.
  5. محدودیت حافظه و زمان.: اسکریپت سنگین ممکن است وسط کار قطع شود. خطا را در لاگ می بینید. اگر هاست محدودیت منابع دارد و پیام 508 می گیرید، راهنمای خطای Resource Limit Reached را ببینید.
  6. اجرای هم زمان.: اگر اجرای قبلی تمام نشده و اجرای بعدی شروع شود، دو نسخه همزمان کار می کنند و داده ها دوباره نویسی می شوند یا منابع پر می شود.

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

*/5 * * * * flock -n /home/USERNAME/task.lock /usr/local/bin/php /home/USERNAME/public_html/cron/task.php >> /home/USERNAME/cron.log 2>&1

چند نکته درباره زمان بندی و محدودیت ها

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

کرون روی چند کاربر یا چند دامنه

هر حساب cPanel کرون های خودش را دارد و کرون یک حساب به فایل های حساب دیگر دسترسی ندارد. اگر چند سایت در یک حساب دارید، همه کرون ها در همان صفحه فهرست می شوند و بهتر است برای هر کدام یک نام روشن در نام فایل لاگ بگذارید تا بعدا بفهمید کدام کار خطا داده است.

چطور مطمئن شویم کرون اجرا شده

بهترین راه این است که خود اسکریپت یک خط با تاریخ در لاگ بنویسد. در PHP همین کافی است:

file_put_contents('/home/USERNAME/cron.log', date('c') . " ok\n", FILE_APPEND);

بعد در File Manager یا با tail -n 20 /home/USERNAME/cron.log آخرین خط ها را ببینید. اگر خطی نیست، یعنی کرون اصلا شروع نشده و مشکل از زمان بندی یا مسیر php است. اگر خط هست و نتیجه درست نیست، مشکل داخل اسکریپت است. برای آزمایش اولیه کرون را روی * * * * * بگذارید، یک یا دو دقیقه صبر کنید، نتیجه را ببینید و بعد زمان بندی واقعی را بنویسید.

کرون برای ربات تلگرام و وردپرس

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

در وردپرس هم wp-cron فقط با بازدید سایت فعال می شود و روی سایت کم بازدید دیر اجرا می شود، روی سایت پربازدید هم بار اضافه می سازد. برای حل این مشکل، قبل از هر تغییر از wp-config.php نسخه پشتیبان بگیرید و این خط را اضافه کنید:

define('DISABLE_WP_CRON', true);

بعد در cPanel یک کرون واقعی بسازید که هر پنج دقیقه wp-cron.php را اجرا کند:

*/5 * * * * /usr/local/bin/php /home/USERNAME/public_html/wp-cron.php > /dev/null 2>&1

پیکوهاست روی هاست های cPanel خود همین بخش Cron Jobs را در اختیار شما می گذارد. اگر نمی دانید برای سایت وردپرسی چه تنظیم هایی لازم است، چک لیست هاست وردپرس را هم ببینید. برای جزئیات بیشتر از خود cPanel می توانید به مستندات رسمی cPanel مراجعه کنید.