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

Cron یکی از ابزارهایی است که وقتی باهاش آشنا می‌شوید، تعجب می‌کنید چطور تا حالا بدونش کار کرده‌اید. در این راهنما از مفهوم اولیه تا پیاده‌سازی عملی توضیح می‌دهیم.

Cron Job چیست؟

Cron یک سرویس زمان‌بندی (Task Scheduler) در سیستم‌عامل‌های Unix/Linux است. این سرویس در پس‌زمینه اجرا می‌شود و در زمان‌های مشخصی دستورات یا اسکریپت‌ها را خودکار اجرا می‌کند. هر وظیفه‌ای که تعریف می‌کنید یک Cron Job نامیده می‌شود.

کلمه «Cron» از واژه یونانی Chronos به معنای «زمان» گرفته شده. Cron Job ها در یک فایل متنی به نام Crontab (مخفف Cron Table) ذخیره می‌شوند. هر کاربر لینوکس می‌تواند Crontab مخصوص خودش را داشته باشد.

در دنیای وب‌هاستینگ، Cron Job را از طریق cPanel هم می‌توان تنظیم کرد — بدون نیاز به دانش خط فرمان.

کاربردهای رایج Cron Job

وقتی می‌گوییم Cron Job، منظور فقط یک ابزار تکنیکال نیست. بخش بزرگی از اتوماسیون وب روی همین ابزار بنا شده:

  • بکاپ خودکار دیتابیس: هر شب ساعت ۲ بامداد، mysqldump اجرا می‌شود و فایل فشرده‌ای از کل دیتابیس ذخیره می‌شود.
  • ارسال ایمیل‌های زمان‌بندی‌شده: خبرنامه هفتگی هر دوشنبه صبح ارسال می‌شود.
  • پاک‌سازی فایل‌های موقت: پوشه‌های کش، فایل‌های آپلود ناتمام، و لاگ‌های قدیمی به‌صورت دوره‌ای حذف می‌شوند.
  • آپدیت داده از API: نرخ ارز یا موجودی کالا هر ۱۵ دقیقه از API خارجی دریافت و به‌روز می‌شود.
  • اجرای wp-cron وردپرس: انتشار پست‌های زمان‌بندی‌شده، چک کردن آپدیت افزونه‌ها، و وظایف داخلی وردپرس.
  • تولید گزارش: هر ماه اول، گزارش فروش ماه قبل به‌صورت PDF ساخته و ایمیل می‌شود.
  • ایندکس‌گذاری مجدد: موتور جستجوی سایت هر شب ایندکس خود را به‌روز می‌کند.
  • بررسی سلامت سرور: هر ۵ دقیقه یک اسکریپت وضعیت سرویس‌ها را چک می‌کند و اگر مشکلی بود پیام می‌فرستد.

سینتکس Cron Job

هر خط در Crontab یک Cron Job است و از پنج فیلد زمانی و یک دستور تشکیل شده:

* * * * * /path/to/command
│ │ │ │ │
│ │ │ │ └─ روز هفته (0-7، هر دو 0 و 7 یکشنبه‌اند)
│ │ │ └─── ماه (1-12)
│ │ └───── روز ماه (1-31)
│ └─────── ساعت (0-23)
└───────── دقیقه (0-59)

وقتی از * استفاده می‌کنید، یعنی «هر مقدار ممکن». پس * * * * * یعنی هر دقیقه اجرا شو.

مثال‌های کاربردی

  • 0 3 * * * — هر روز ساعت ۳:۰۰ بامداد (مثلاً برای بکاپ شبانه)
  • 30 8 * * 1-5 — هر روز کاری (دوشنبه تا جمعه) ساعت ۸:۳۰
  • */15 * * * * — هر ۱۵ دقیقه یک بار
  • 0 0 * * 0 — هر یکشنبه نیمه‌شب
  • 0 9 1 * * — روز اول هر ماه ساعت ۹ صبح
  • 0 */6 * * * — هر ۶ ساعت یک بار
  • 0 0 1 1 * — اول هر سال (اول ژانویه نیمه‌شب)

ابزار آنلاین crontab.guru برای تست و درک سینتکس Cron بسیار مفید است — آدرس را وارد کنید و به فارسی توضیح می‌دهد کِی اجرا می‌شود.

کلیدواژه‌های از پیش تعریف‌شده

به‌جای سینتکس عددی، می‌توانید از این کلیدواژه‌های کوتاه استفاده کنید:

  • @hourly — هر ساعت (معادل 0 * * * *)
  • @daily یا @midnight — هر روز نیمه‌شب
  • @weekly — هر هفته یکشنبه نیمه‌شب
  • @monthly — اول هر ماه نیمه‌شب
  • @yearly یا @annually — اول هر سال
  • @reboot — یک بار بعد از هر راه‌اندازی مجدد سرور

چطور در cPanel Cron Job تنظیم کنیم؟

اگر از هاست اشتراکی با cPanel استفاده می‌کنید، Cron Job در بخش Advanced در دسترس است. مراحل:

  1. وارد cPanel شوید.
  2. در بخش Advanced، روی Cron Jobs کلیک کنید.
  3. در قسمت Add New Cron Job، زمان اجرا را تنظیم کنید — می‌توانید از منوهای کشویی استفاده کنید یا مستقیم سینتکس وارد کنید.
  4. در فیلد Command، دستور را وارد کنید.
  5. Add New Cron Job را بزنید.

نمونه دستورات رایج برای cPanel

نکته مهم: در Cron Job ها همیشه از مسیر کامل (Absolute Path) استفاده کنید. مسیر نسبی کار نمی‌کند چون محیط Cron با محیط shell معمولی فرق دارد.

  • اجرای اسکریپت PHP:
    /usr/local/bin/php /home/username/public_html/cron.php
  • اجرای wp-cron وردپرس:
    /usr/local/bin/php /home/username/public_html/wp-cron.php
  • اجرای اسکریپت Python:
    /usr/bin/python3 /home/username/scripts/myscript.py
  • فراخوانی URL با curl:
    /usr/bin/curl -s https://example.com/cron-url > /dev/null 2>&1

مسیر دقیق PHP را می‌توانید با اجرای which php در SSH پیدا کنید. روی اکثر هاست‌های اشتراکی /usr/local/bin/php است.

مدیریت Cron Job از خط فرمان SSH

اگر به SSH دسترسی دارید، می‌توانید Crontab را مستقیماً ویرایش کنید:

  • crontab -e — باز کردن Crontab برای ویرایش (از ادیتور پیش‌فرض shell استفاده می‌کند)
  • crontab -l — نمایش لیست تمام Cron Job های فعلی
  • crontab -r — حذف تمام Cron Job ها (مراقب باشید!)

یک Cron Job نمونه در Crontab چنین به نظر می‌رسد:

0 2 * * * /usr/local/bin/php /home/myuser/public_html/backup.php >> /home/myuser/logs/backup.log 2>&1

این خط هر روز ساعت ۲ بامداد اسکریپت backup.php را اجرا می‌کند و خروجی را در یک فایل لاگ می‌نویسد.

خروجی Cron Job و لاگ‌گیری

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

  • حذف کامل خروجی: command > /dev/null 2>&1
  • ذخیره خروجی در فایل لاگ: command >> /home/username/logs/cron.log 2>&1

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

خطاهای رایج و رفع آن‌ها

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

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

خطای Permission Denied

اسکریپت shell شما باید دسترسی اجرا داشته باشد. با این دستور درستش کنید:

chmod +x /path/to/script.sh

متغیرهای محیطی کار نمی‌کنند

محیط Cron بسیار محدودتر از shell تعاملی است. $PATH و متغیرهای دیگر که معمولاً موجودند ممکن است در Cron تعریف نشده باشند. راه‌حل: متغیرهای مورد نیاز را در ابتدای Crontab یا داخل خود اسکریپت تعریف کنید.

وردپرس wp-cron کار نمی‌کند

wp-cron وردپرس به بازدید صفحه برای trigger شدن نیاز دارد، نه اجرای واقعی سیستمی. برای سایت‌های کم‌ترافیک، بهتر است wp-cron داخلی را غیرفعال کنید و به‌جایش یک Cron Job واقعی سیستمی تنظیم کنید:

*/10 * * * * /usr/local/bin/php /home/username/public_html/wp-cron.php

نکات امنیتی

  • Cron Job هایی که نیاز به دسترسی root ندارند را با کاربر عادی اجرا کنید — از اصل حداقل دسترسی پیروی کنید.
  • اسکریپت‌هایی که در Cron اجرا می‌شوند و ورودی خارجی می‌گیرند، باید آن ورودی را به‌دقت اعتبارسنجی کنند.
  • فایل‌های Crontab نباید دسترسی نوشتن برای گروه یا دیگران داشته باشند.
  • لاگ‌ها را به‌صورت دوره‌ای بررسی کنید تا مطمئن شوید همه چیز درست کار می‌کند.
  • اسکریپت‌های PHP که از Cron اجرا می‌شوند باید با exit() خاتمه یابند تا فرایند زامبی نشود.

سوالات متداول

آیا می‌توانم Cron Job را بیشتر از یک بار در دقیقه اجرا کنم؟

Cron حداکثر هر یک دقیقه یک بار اجرا می‌کند. برای اجرای هر چند ثانیه، باید داخل خود اسکریپت یک حلقه با sleep تعریف کنید. مثلاً اگر می‌خواهید هر ۱۰ ثانیه چیزی اجرا شود، اسکریپت‌تان باید ۶ بار با sleep 10 ثانیه اجرا شود و هر دقیقه یک بار از Cron فراخوانی شود.

آیا Cron Job بعد از ری‌استارت سرور فعال می‌ماند؟

بله. Cron Job هایی که در Crontab ذخیره شده‌اند بعد از ری‌استارت هم فعال هستند. تنها استثنا Job هایی هستند که با @reboot تعریف شده‌اند — آن‌ها یک‌بار بعد از هر راه‌اندازی مجدد اجرا می‌شوند.

Cron Job در هاست اشتراکی چقدر قابل اطمینان است؟

در هاست اشتراکی، Cron Job ها معمولاً به درستی کار می‌کنند، اما ممکن است تأخیر اندکی داشته باشند — به‌خصوص اگر سرور تحت فشار باشد. برای وظایفی که نیاز به اجرای دقیق در لحظه خاصی دارند (مثل پردازش تراکنش‌های مالی)، VPS با کنترل کامل توصیه می‌شود.

چطور مطمئن شوم Cron Job درست اجرا می‌شود؟

بهترین روش: لاگ ذخیره کنید. دستور Cron را به این شکل تنظیم کنید: command >> /home/username/cron.log 2>&1. بعد از اولین زمان اجرای مورد انتظار، فایل لاگ را بررسی کنید. اگر فایل لاگ خالی است یا ساخته نشده، Cron اصلاً اجرا نشده — احتمالاً مشکل در سینتکس زمانی یا مسیر فایل است.

جمع‌بندی

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

اگر از هاست اشتراکی با cPanel استفاده می‌کنید، Cron Job در بخش Advanced در دسترس است و بدون هیچ دانش خط فرمانی می‌توانید آن را تنظیم کنید. برای پروژه‌هایی که نیاز به Cron Job های پیچیده‌تر، اجرای دقیق زمانی، یا دسترسی SSH دارند، یک VPS کنترل بسیار بیشتری در اختیارتان می‌گذارد.