آموزش لینوکس وب‌داده

اجرای خودکار دستورات در لینوکس با Cron Job

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

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

Cron Job در لینوکس چیست؟

Cron یک سرویس زمان‌بندی وظایف در سیستم‌های مبتنی بر Unix و Linux است. وظیفه آن این است که در زمان‌های مشخص، دستورها و برنامه‌هایی را که قبلاً تعریف کرده‌ایم اجرا کند.

برای مثال فرض کنید یک اسکریپت با نام زیر روی سرور دارید:
/usr/local/bin/backup.sh
Bash
اجرای دستی این اسکریپت ساده است، اما اگر بخواهید هر روز ساعت 3 صبح اجرا شود، منطقی نیست هر شب به SSH متصل شوید و آن را اجرا کنید.

در این شرایط می‌توانیم Cron Job زیر را تعریف کنیم:
0 3 * * * /usr/local/bin/backup.sh
Bash

از این لحظه، سیستم به‌صورت خودکار هر روز ساعت 3 بامداد اسکریپت موردنظر را اجرا می‌کند.

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

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

تفاوت Cron، Cron Job و Crontab چیست؟

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

برای مثال:
crontab -e
Bash
فایل Crontab کاربر جاری را برای ویرایش باز می‌کند.

و دستور زیر:
crontab -l
Bash
تمام Cron Jobهای ثبت‌شده برای کاربر را نمایش می‌دهد.

در واقع رابطه این سه مفهوم را می‌توان این‌طور خلاصه کرد:
Crontab
   ↓
Cron Job
   ↓
Cron Service
   ↓
اجرای دستور در زمان مشخص
Bash

ساختار دستور Cron Job چگونه است؟

برای ساخت یک Cron Job ابتدا باید ساختار زمان‌بندی Crontab را بشناسیم.

ساختار معمول یک Cron Job به شکل زیر است:
* * * * * command
│ │ │ │ │
│ │ │ │ └── روز هفته
│ │ │ └──── ماه
│ │ └────── روز ماه
│ └──────── ساعت
└────────── دقیقه
Bash
پنج فیلد اول مشخص می‌کنند دستور چه زمانی اجرا شود و قسمت آخر دستوری است که باید اجرا شود.

ساختار Crontab و Cron Job در لینوکس
فیلدمقدار معمولتوضیح
Minute0 تا 59دقیقه اجرا
Hour0 تا 23ساعت اجرا
Day of Month1 تا 31روز ماه
Month1 تا 12ماه
Day of Week0 تا 7روز هفته
Command—دستور قابل اجرا
در اکثر پیاده‌سازی‌های متداول Cron، عدد صفر یا 7 برای یکشنبه استفاده می‌شود. مستندات Debian نیز همین ساختار پنج فیلدی را برای Crontab کاربر تعریف می‌کند.

برای نمونه:
30 2 * * * /home/user/script.sh
Bash
یعنی:
دقیقه: 30
ساعت: 2
روز ماه: هر روز
ماه: هر ماه
روز هفته: هر روز
Bash
پس اسکریپت هر شب ساعت 02:30 اجرا خواهد شد.
علامت ستاره در Cron چه معنایی دارد؟
علامت * به معنی «هر مقدار ممکن» است.

مثلاً:
* * * * * /path/script.sh
Bash
یعنی دستور در هر دقیقه، هر ساعت، هر روز، هر ماه و هر روز هفته اجرا شود؛ بنابراین عملاً هر دقیقه یک بار اجرا خواهد شد.

علاوه بر علامت *، می‌توان از کاما، خط تیره و Slash برای تعریف زمان‌بندی‌های دقیق‌تر استفاده کرد.
استفاده از کاما
اگر بخواهیم یک دستور ساعت 9 و 18 اجرا شود:
0 9,18 * * * /path/script.sh
Bash

استفاده از خط تیره
برای اجرای یک کار از دوشنبه تا جمعه:
0 8 * * 1-5 /path/script.sh
Bash

استفاده از Slash
برای اجرای دستور هر 5 دقیقه:
*/5 * * * * /path/script.sh
Bash
امکان استفاده از Range، List و Step در فیلدهای Crontab در مستندات رسمی نیز تعریف شده است.

آموزش ساخت اولین Cron Job در لینوکس

برای مدیریت Cron Job معمولاً ابتدا باید از طریق SSH وارد سرور شوید.

اگر با SSH آشنایی ندارید، ابتدا مقاله << آموزش اتصال به سرور با SSH >>را مطالعه کنید.
پس از ورود به سرور دستور زیر را اجرا کنید:
crontab -e
Bash
اگر برای اولین بار Crontab را باز می‌کنید، ممکن است سیستم از شما بخواهد ویرایشگر متن موردنظر را انتخاب کنید. برای کاربران تازه‌کار، nano معمولاً گزینه ساده‌تری است.

حالا Cron Job موردنظر را در انتهای فایل قرار دهید.

برای آزمایش می‌توانیم بنویسیم:
* * * * * date >> /tmp/cron-test.log
Bash
این دستور هر دقیقه تاریخ و زمان جاری سیستم را داخل فایل زیر ثبت می‌کند:
/tmp/cron-test.log
Bash
چند دقیقه بعد می‌توانید محتویات آن را بررسی کنید:
cat /tmp/cron-test.log
Bash

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

دستورات مهم مدیریت Crontab

برای مشاهده تمام Cron Jobهای کاربر جاری:
crontab -l
bash
برای ویرایش آن‌ها:
crontab -e
Bash
برای مشاهده Crontab یک کاربر دیگر با دسترسی root:
crontab -u username -l
Bash
و برای ویرایش آن:
crontab -u username -e
Bash
در استفاده از دستور زیر بسیار دقت کنید:
crontab -r
Bash
زیرا Crontab کاربر را حذف می‌کند.

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

15 مثال کاربردی Cron Job در لینوکس

1. اجرای دستور در هر دقیقه:
* * * * * /path/script.sh
Bash
2. اجرای دستور هر 5 دقیقه:
*/5 * * * * /path/script.sh
Bash
3. اجرای دستور هر 15 دقیقه:
*/15 * * * * /path/script.sh
Bash
4. اجرای دستور ابتدای هر ساعت:
0 * * * * /path/script.sh
Bash
5. اجرای دستور هر روز ساعت 3 صبح:
0 3 * * * /path/script.sh
Bash
6. اجرای دستور هر روز ساعت 2:30 صبح:
30 2 * * * /path/script.sh
Bash
7. اجرای دستور شنبه‌ها ساعت 4 صبح:

در ساختار متداول Cron، شنبه روز شماره 6 است.
0 4 * * 6 /path/script.sh
Bash
8. اجرای دستور دوشنبه تا جمعه ساعت 8 صبح:
0 8 * * 1-5 /path/script.sh
Bash
9. اجرای دستور در اولین روز هر ماه:
0 0 1 * * /path/script.sh
Bash
10. اجرای دستور ساعت 9 صبح و 6 عصر:
0 9,18 * * * /path/script.sh
Bash
11. اجرای دستور هر 6 ساعت:
0 */6 * * * /path/script.sh
Bash
12. اجرای اسکریپت بعد از Boot:

بسیاری از پیاده‌سازی‌های Cron از عبارت زیر پشتیبانی می‌کنند
@reboot /path/startup.sh
Bash
13. اجرای فایل PHP با Cron Job:

ابتدا مسیر PHP را پیدا کنید.
which php
Bash
مثلاً اگر خروجی این باشد:
/usr/bin/php
Bash
Cron Job می‌تواند به شکل زیر باشد:
0 2 * * * /usr/bin/php /var/www/example/cron.php
Bash
14. اجرای برنامه Python
0 6 * * * /usr/bin/python3 /opt/scripts/report.py
Bash
15. ذخیره خروجی Cron داخل فایل Log
0 3 * * * /usr/local/bin/backup.sh >> /home/user/backup.log 2>&1
Bash
با استفاده از:
2>&1
Bash
هم خروجی استاندارد و هم خطاهای دستور در فایل Log ذخیره می‌شوند.

یک مثال واقعی: بکاپ‌گیری خودکار با Cron Job

یکی از بهترین کاربردهای Cron، ساخت بکاپ خودکار است.

فرض کنیم می‌خواهیم از مسیر زیر بکاپ بگیریم:
/var/www/example
Bash
ابتدا فایل زیر را ایجاد کنید:
nano /usr/local/bin/backup.sh
Bash
محتوای ساده آن می‌تواند چنین باشد:
#!/bin/bash

DATE=$(date +%Y-%m-%d_%H-%M)
BACKUP_DIR="/backup"

mkdir -p "$BACKUP_DIR"

tar -czf "$BACKUP_DIR/site-$DATE.tar.gz" /var/www/example
Bash
سپس اجازه اجرا بدهید:
chmod +x /usr/local/bin/backup.sh
Bash
اسکریپت را یک بار به‌صورت دستی تست کنید:
/usr/local/bin/backup.sh
Bash
اگر بکاپ با موفقیت ایجاد شد، حالا آن را به Crontab اضافه کنید:
crontab -e
Bash
و بنویسید:
0 3 * * * /usr/local/bin/backup.sh
Bash
از این پس بکاپ هر شب ساعت 3 ایجاد می‌شود.

برای پیاده‌سازی یک سناریوی کامل‌تر بکاپ، می‌توانید مقاله اتوماسیون بکاپ‌گیری با Cron Job و Rsync را مطالعه کنید.

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

این یکی از رایج‌ترین مشکلات Cron است.

ممکن است دستور زیر در Terminal کاملاً درست اجرا شود:
python3 script.py
Bash
اما همان دستور در Crontab کار نکند.

یکی از دلایل رایج این است که Cron دستورها را در محیطی متفاوت از Shell تعاملی شما اجرا می‌کند؛ در نتیجه متغیرهایی مانند PATH ممکن است مقدار متفاوت یا محدودتری داشته باشند.
به همین دلیل بهتر است در Cron Jobها از مسیر کامل فایل اجرایی استفاده کنید.

به جای:
python3 /opt/script.py
Bash
از این استفاده کنید:
/usr/bin/python3 /opt/script.py
Bash
همین موضوع برای PHP، Rsync، Bash و سایر برنامه‌ها نیز صدق می‌کند.

برای پیدا کردن مسیر برنامه می‌توانید از which استفاده کنید:
which python3
which php
which rsync
Bash
در مقاله تخصصی بکاپ وب‌داده نیز استفاده از Absolute Path برای اجرای Cron توصیه شده است.

بررسی فعال بودن سرویس Cron

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

در Ubuntu و Debian معمولاً:
systemctl status cron
Bash
برای راه‌اندازی:
sudo systemctl start cron
Bash
و برای فعال شدن هنگام Boot:
sudo systemctl enable cron
Bash
در توزیع‌هایی مانند AlmaLinux، Rocky Linux و برخی سیستم‌های خانواده RHEL معمولاً نام سرویس crond است:
systemctl status crond
Bash
و:
systemctl enable --now crond
Bash

چگونه لاگ Cron Job را بررسی کنیم؟
برای پیدا کردن دلیل اجرا نشدن یک Cron Job، Logها اهمیت زیادی دارند.

روی Ubuntu و Debian بسته به تنظیمات سیستم می‌توانید از Journal استفاده کنید:
journalctl -u cron
Bash
یا:
journalctl -u cron --since today
Bash
در سیستم‌هایی که رویدادهای Cron در Syslog ثبت می‌شوند:
grep CRON /var/log/syslog
Bash
در بعضی توزیع‌های مبتنی بر RHEL:
tail -f /var/log/cron
Bash
یا:
journalctl -u crond
Bash
برای عیب‌یابی دقیق‌تر، بهتر است خروجی و خطاهای اسکریپت را مستقیماً در یک فایل Log ذخیره کنید:
* * * * * /path/script.sh >> /home/user/cron.log 2>&1
Bash
به این ترتیب اگر برنامه خطایی ایجاد کند، می‌توانید پیام خطا را مستقیماً ببینید.
عیب یابی اجرا نشدن Cron Job در لینوکس

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

فرض کنید یک اسکریپت هر 5 دقیقه اجرا می‌شود:
*/5 * * * * /path/task.sh
Bash
اما اجرای اسکریپت بعضی اوقات 10 دقیقه طول می‌کشد.

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

یکی از راهکارهای رایج در لینوکس استفاده از flock است:
*/5 * * * * /usr/bin/flock -n /tmp/task.lock /path/task.sh
Bash
تا زمانی که اجرای قبلی Lock را در اختیار دارد، اجرای جدید شروع نمی‌شود.

این موضوع مخصوصاً برای بکاپ، Import/Export دیتابیس، ارسال ایمیل انبوه و Jobهای پردازشی اهمیت زیادی دارد.

Cron Job با کدام کاربر اجرا می‌شود؟

Cron Jobهای ایجادشده با:
crontab -e
Bash
با همان کاربری اجرا می‌شوند که Crontab متعلق به او است. این موضوع در مستندات Debian نیز صراحتاً ذکر شده است.

بنابراین اگر کاربر مربوط به Cron Job سطح دسترسی لازم به یک فایل یا دایرکتوری را نداشته باشد، Cron نیز قادر به اجرای صحیح دستور نخواهد بود.
برای نمونه ممکن است یک اسکریپت با کاربر root اجرا شود اما با کاربر www-data یا یک User عادی با خطای Permission مواجه شود.

در نتیجه هنگام عیب‌یابی حتماً Permission فایل‌ها را هم بررسی کنید:
ls -lah /path/script.sh
Bash
و مطمئن شوید اسکریپت قابلیت اجرا دارد:
chmod +x /path/script.sh
Bash

اهمیت Timezone در Cron Job
زمان اجرای Cron Jobها به ساعت و منطقه زمانی تنظیم‌شده روی سرور وابسته است. اگر یک Job در ساعتی متفاوت از زمان مورد انتظار اجرا می‌شود، ابتدا Timezone سیستم را بررسی کنید:
timedatectl
Bash
برای مثال ممکن است سرور روی UTC تنظیم شده باشد، در حالی که شما زمان ایران را هنگام تعریف Cron Job در نظر گرفته باشید. این موضوع به‌خصوص در سرورهایی که در دیتاسنترهای کشورهای مختلف قرار دارند اهمیت دارد.

تفاوت Crontab کاربر با /etc/crontab

Crontab معمولی کاربر که با دستور زیر ویرایش می‌شود:
crontab -e
Bash

دارای پنج فیلد زمان و سپس دستور است:

minute hour day month weekday command
Bash
اما /etc/crontab یک Crontab سیستمی است و علاوه بر زمان، فیلدی برای مشخص کردن User نیز دارد.

برای مثال:
0 3 * * * root /usr/local/bin/backup.sh
Bash
بنابراین نباید Syntax مربوط به /etc/crontab را بدون تغییر داخل crontab -e قرار دهید.

Cron Job یا Systemd Timer؟

در توزیع‌های لینوکسی جدید، systemd timer نیز برای زمان‌بندی وظایف در دسترس است.

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

در مقابل، Systemd Timer امکانات بیشتری برای مدیریت سرویس‌ها، وابستگی‌ها، ثبت Log و کنترل اجرای وظایف ارائه می‌دهد. برای اغلب کاربران VPS و مدیران وب‌سایت، Cron انتخاب ساده‌تری است؛ اما در سناریوهای پیچیده‌تر، Systemd Timer می‌تواند گزینه مناسب‌تری باشد.

نکات امنیتی هنگام استفاده از Cron Job

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

از قرار دادن Password، Token یا API Key مستقیماً داخل دستور Crontab خودداری کنید. Permission اسکریپت‌ها را محدود نگه دارید و تا جای ممکن Cron Job را با کاربری اجرا کنید که فقط دسترسی‌های موردنیاز را دارد.

همچنین از تعریف Jobهای پرتکرار، مانند اجرای هر دقیقه، بدون نیاز واقعی خودداری کنید. یک Job سنگین که هر دقیقه اجرا شود می‌تواند CPU، RAM، Disk I/O یا دیتابیس سرور را تحت فشار قرار دهد.

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

ابزار Crontab Guru برای بررسی زمان‌بندی Cron

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

برای مثال عبارت:
*/10 * * * *
Bash
را وارد می‌کنید و ابزار مفهوم آن را به زبان ساده نمایش می‌دهد.
این ابزار مخصوصاً هنگام ساخت Expressionهای پیچیده کاربردی است.

جمع‌بندی

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

برای استفاده مطمئن از Cron، تنها تنظیم زمان اجرا کافی نیست؛ مسیر کامل دستورات، سطح دسترسی کاربر، Timezone سرور و ثبت Log نیز باید به‌درستی تنظیم شوند. اگر یک Cron Job اجرا نمی‌شود، بررسی همین موارد معمولاً سریع‌ترین راه برای پیدا کردن علت مشکل است.

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

اجرای Cron Job روی سرور مجازی لینوکس

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

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

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

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

Cron Job چیست؟

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

برای مشاهده Cron Jobهای کاربر جاری از دستور زیر استفاده کنید:

crontab -l

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

crontab -e

سپس Expression زمان‌بندی و دستور موردنظر را به انتهای فایل اضافه کنید.

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

*/5 * * * * /path/command

رایج‌ترین دلایل شامل اشتباه بودن Syntax، غیرفعال بودن سرویس Cron، Permission نامناسب، استفاده نکردن از Absolute Path، تفاوت Environment، Timezone اشتباه یا بروز خطا در خود Script هستند.

Setareh Mirzaei
Setareh Mirzaei

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

مقاله‌ها: 20
پاسخی بگذارید

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