Cron Job در لینوکس ابزاری برای زمانبندی و اجرای خودکار دستورات و اسکریپتها است. در این آموزش با ساختار Crontab، نحوه تنظیم زمان اجرا، مثالهای کاربردی و روش عیبیابی Cron Job آشنا میشوید.
در مدیریت یک سرور لینوکسی، بسیاری از کارها باید بهصورت دورهای انجام شوند؛ از بکاپگیری و پاکسازی فایلهای موقت گرفته تا اجرای اسکریپتهای مانیتورینگ و تهیه گزارش. انجام دستی این کارها هم زمانبر است و هم احتمال فراموش شدن آنها وجود دارد. Cron این امکان را فراهم میکند که اجرای این وظایف را زمانبندی کنید. برای مثال میتوانید مشخص کنید یک اسکریپت هر 10 دقیقه اجرا شود، هر شب از اطلاعات سرور بکاپ گرفته شود یا یک دستور در ابتدای هر ماه اجرا شود. در ادامه با نحوه کار Cron، ساختار Crontab، روش ایجاد Cron Job و عیبیابی مشکلات رایج آن در لینوکس آشنا میشویم.
Cron Job در لینوکس چیست؟
Cron یک سرویس زمانبندی وظایف در سیستمهای مبتنی بر Unix و Linux است. وظیفه آن این است که در زمانهای مشخص، دستورها و برنامههایی را که قبلاً تعریف کردهایم اجرا کند.
برای مثال فرض کنید یک اسکریپت با نام زیر روی سرور دارید:
Copy
/usr/local/bin/backup.sh
Bash
اجرای دستی این اسکریپت ساده است، اما اگر بخواهید هر روز ساعت 3 صبح اجرا شود، منطقی نیست هر شب به SSH متصل شوید و آن را اجرا کنید.
در این شرایط میتوانیم Cron Job زیر را تعریف کنیم:
Copy
03***/usr/local/bin/backup.sh
Bash
از این لحظه، سیستم بهصورت خودکار هر روز ساعت 3 بامداد اسکریپت موردنظر را اجرا میکند.
طبق مستندات Cron، هر کاربر میتواند Crontab مخصوص خودش را داشته باشد و دستورهای موجود در آن با دسترسی همان کاربر اجرا میشوند. Cron نیز ورودیهای زمانبندی را بهطور دورهای بررسی میکند تا وظایفی را که زمان اجرای آنها رسیده است اجرا کند.
تفاوت Cron، Cron Job و Crontab چیست؟
این سه اصطلاح معمولاً در کنار یکدیگر استفاده میشوند اما دقیقاً یک معنی ندارند. Cron سرویس یا Daemon اصلی است که در پسزمینه لینوکس اجرا میشود و زمان اجرای وظایف را کنترل میکند. Cron Job به هر وظیفهای گفته میشود که برای اجرا در یک زمان مشخص به Cron سپرده شده است. Crontab نیز فایل یا دستوری است که Cron Jobهای یک کاربر در آن تعریف میشوند.
برای مثال:
Copy
crontab-e
Bash
فایل Crontab کاربر جاری را برای ویرایش باز میکند.
و دستور زیر:
Copy
crontab-l
Bash
تمام Cron Jobهای ثبتشده برای کاربر را نمایش میدهد.
در واقع رابطه این سه مفهوم را میتوان اینطور خلاصه کرد:
Copy
Crontab↓CronJob↓CronService↓اجرایدستوردرزمانمشخص
Bash
ساختار دستور Cron Job چگونه است؟
برای ساخت یک Cron Job ابتدا باید ساختار زمانبندی Crontab را بشناسیم.
پنج فیلد اول مشخص میکنند دستور چه زمانی اجرا شود و قسمت آخر دستوری است که باید اجرا شود.
فیلد
مقدار معمول
توضیح
Minute
0 تا 59
دقیقه اجرا
Hour
0 تا 23
ساعت اجرا
Day of Month
1 تا 31
روز ماه
Month
1 تا 12
ماه
Day of Week
0 تا 7
روز هفته
Command
—
دستور قابل اجرا
در اکثر پیادهسازیهای متداول Cron، عدد صفر یا 7 برای یکشنبه استفاده میشود. مستندات Debian نیز همین ساختار پنج فیلدی را برای Crontab کاربر تعریف میکند.
برای نمونه:
Copy
302***/home/user/script.sh
Bash
یعنی:
Copy
دقیقه:30ساعت:2روزماه:هرروزماه:هرماهروزهفته:هرروز
Bash
پس اسکریپت هر شب ساعت 02:30 اجرا خواهد شد.
علامت ستاره در Cron چه معنایی دارد؟
علامت * به معنی «هر مقدار ممکن» است.
مثلاً:
Copy
***** /path/script.sh
Bash
یعنی دستور در هر دقیقه، هر ساعت، هر روز، هر ماه و هر روز هفته اجرا شود؛ بنابراین عملاً هر دقیقه یک بار اجرا خواهد شد.
علاوه بر علامت *، میتوان از کاما، خط تیره و Slash برای تعریف زمانبندیهای دقیقتر استفاده کرد.
استفاده از کاما
اگر بخواهیم یک دستور ساعت 9 و 18 اجرا شود:
Copy
09,18***/path/script.sh
Bash
استفاده از خط تیره
برای اجرای یک کار از دوشنبه تا جمعه:
Copy
08**1-5/path/script.sh
Bash
استفاده از Slash
برای اجرای دستور هر 5 دقیقه:
Copy
*/5 **** /path/script.sh
Bash
امکان استفاده از Range، List و Step در فیلدهای Crontab در مستندات رسمی نیز تعریف شده است.
آموزش ساخت اولین Cron Job در لینوکس
برای مدیریت Cron Job معمولاً ابتدا باید از طریق SSH وارد سرور شوید.
اگر برای اولین بار Crontab را باز میکنید، ممکن است سیستم از شما بخواهد ویرایشگر متن موردنظر را انتخاب کنید. برای کاربران تازهکار، nano معمولاً گزینه سادهتری است.
حالا Cron Job موردنظر را در انتهای فایل قرار دهید.
برای آزمایش میتوانیم بنویسیم:
Copy
***** date >> /tmp/cron-test.log
Bash
این دستور هر دقیقه تاریخ و زمان جاری سیستم را داخل فایل زیر ثبت میکند:
Copy
/tmp/cron-test.log
Bash
چند دقیقه بعد میتوانید محتویات آن را بررسی کنید:
Copy
cat/tmp/cron-test.log
Bash
اگر زمانهای مختلف داخل فایل قرار گرفته باشند، Cron Job با موفقیت اجرا شده است.
دستورات مهم مدیریت Crontab
برای مشاهده تمام Cron Jobهای کاربر جاری:
Copy
crontab -l
bash
برای ویرایش آنها:
Copy
crontab-e
Bash
برای مشاهده Crontab یک کاربر دیگر با دسترسی root:
Copy
crontab-uusername-l
Bash
و برای ویرایش آن:
Copy
crontab-uusername-e
Bash
در استفاده از دستور زیر بسیار دقت کنید:
Copy
crontab-r
Bash
زیرا Crontab کاربر را حذف میکند.
اگر میخواهید قبل از حذف از شما تأیید گرفته شود و نسخه Cron شما از آن پشتیبانی میکند، میتوانید از گزینه مربوط به تأیید تعاملی استفاده کنید.
15 مثال کاربردی Cron Job در لینوکس
1. اجرای دستور در هر دقیقه:
Copy
***** /path/script.sh
Bash
2. اجرای دستور هر 5 دقیقه:
Copy
*/5 **** /path/script.sh
Bash
3. اجرای دستور هر 15 دقیقه:
Copy
*/15 **** /path/script.sh
Bash
4. اجرای دستور ابتدای هر ساعت:
Copy
0****/path/script.sh
Bash
5. اجرای دستور هر روز ساعت 3 صبح:
Copy
03***/path/script.sh
Bash
6. اجرای دستور هر روز ساعت 2:30 صبح:
Copy
302***/path/script.sh
Bash
7. اجرای دستور شنبهها ساعت 4 صبح:
در ساختار متداول Cron، شنبه روز شماره 6 است.
Copy
04**6/path/script.sh
Bash
8. اجرای دستور دوشنبه تا جمعه ساعت 8 صبح:
Copy
08**1-5/path/script.sh
Bash
9. اجرای دستور در اولین روز هر ماه:
Copy
001**/path/script.sh
Bash
10. اجرای دستور ساعت 9 صبح و 6 عصر:
Copy
09,18***/path/script.sh
Bash
11. اجرای دستور هر 6 ساعت:
Copy
0*/6***/path/script.sh
Bash
12. اجرای اسکریپت بعد از Boot:
بسیاری از پیادهسازیهای Cron از عبارت زیر پشتیبانی میکنند
چرا Cron Job دستی اجرا میشود اما در Cron اجرا نمیشود؟
این یکی از رایجترین مشکلات Cron است.
ممکن است دستور زیر در Terminal کاملاً درست اجرا شود:
Copy
python3script.py
Bash
اما همان دستور در Crontab کار نکند.
یکی از دلایل رایج این است که Cron دستورها را در محیطی متفاوت از Shell تعاملی شما اجرا میکند؛ در نتیجه متغیرهایی مانند PATH ممکن است مقدار متفاوت یا محدودتری داشته باشند. به همین دلیل بهتر است در Cron Jobها از مسیر کامل فایل اجرایی استفاده کنید.
به جای:
Copy
python3/opt/script.py
Bash
از این استفاده کنید:
Copy
/usr/bin/python3/opt/script.py
Bash
همین موضوع برای PHP، Rsync، Bash و سایر برنامهها نیز صدق میکند.
برای پیدا کردن مسیر برنامه میتوانید از which استفاده کنید:
اگر هیچکدام از Cron Jobها اجرا نمیشوند، اولین چیزی که باید بررسی کنید وضعیت خود سرویس Cron است.
در Ubuntu و Debian معمولاً:
Copy
systemctlstatuscron
Bash
برای راهاندازی:
Copy
sudosystemctlstartcron
Bash
و برای فعال شدن هنگام Boot:
Copy
sudosystemctlenablecron
Bash
در توزیعهایی مانند AlmaLinux، Rocky Linux و برخی سیستمهای خانواده RHEL معمولاً نام سرویس crond است:
Copy
systemctlstatuscrond
Bash
و:
Copy
systemctlenable--nowcrond
Bash
چگونه لاگ Cron Job را بررسی کنیم؟
برای پیدا کردن دلیل اجرا نشدن یک Cron Job، Logها اهمیت زیادی دارند.
روی Ubuntu و Debian بسته به تنظیمات سیستم میتوانید از Journal استفاده کنید:
Copy
journalctl-ucron
Bash
یا:
Copy
journalctl-ucron--sincetoday
Bash
در سیستمهایی که رویدادهای Cron در Syslog ثبت میشوند:
Copy
grepCRON/var/log/syslog
Bash
در بعضی توزیعهای مبتنی بر RHEL:
Copy
tail-f/var/log/cron
Bash
یا:
Copy
journalctl-ucrond
Bash
برای عیبیابی دقیقتر، بهتر است خروجی و خطاهای اسکریپت را مستقیماً در یک فایل Log ذخیره کنید:
Copy
***** /path/script.sh >> /home/user/cron.log 2>&1
Bash
به این ترتیب اگر برنامه خطایی ایجاد کند، میتوانید پیام خطا را مستقیماً ببینید.
جلوگیری از اجرای همزمان چند نسخه از یک Cron Job
فرض کنید یک اسکریپت هر 5 دقیقه اجرا میشود:
Copy
*/5 **** /path/task.sh
Bash
اما اجرای اسکریپت بعضی اوقات 10 دقیقه طول میکشد.
در این شرایط، قبل از پایان اجرای قبلی ممکن است نمونه جدیدی از همان اسکریپت اجرا شود. این وضعیت میتواند باعث مصرف اضافی CPU، اجرای تکراری عملیات یا حتی ایجاد اختلال در دادهها شود.
یکی از راهکارهای رایج در لینوکس استفاده از flock است:
تا زمانی که اجرای قبلی Lock را در اختیار دارد، اجرای جدید شروع نمیشود.
این موضوع مخصوصاً برای بکاپ، Import/Export دیتابیس، ارسال ایمیل انبوه و Jobهای پردازشی اهمیت زیادی دارد.
Cron Job با کدام کاربر اجرا میشود؟
Cron Jobهای ایجادشده با:
Copy
crontab-e
Bash
با همان کاربری اجرا میشوند که Crontab متعلق به او است. این موضوع در مستندات Debian نیز صراحتاً ذکر شده است.
بنابراین اگر کاربر مربوط به Cron Job سطح دسترسی لازم به یک فایل یا دایرکتوری را نداشته باشد، Cron نیز قادر به اجرای صحیح دستور نخواهد بود. برای نمونه ممکن است یک اسکریپت با کاربر root اجرا شود اما با کاربر www-data یا یک User عادی با خطای Permission مواجه شود.
در نتیجه هنگام عیبیابی حتماً Permission فایلها را هم بررسی کنید:
Copy
ls-lah/path/script.sh
Bash
و مطمئن شوید اسکریپت قابلیت اجرا دارد:
Copy
chmod+x/path/script.sh
Bash
اهمیت Timezone در Cron Job
زمان اجرای Cron Jobها به ساعت و منطقه زمانی تنظیمشده روی سرور وابسته است. اگر یک Job در ساعتی متفاوت از زمان مورد انتظار اجرا میشود، ابتدا Timezone سیستم را بررسی کنید:
Copy
timedatectl
Bash
برای مثال ممکن است سرور روی UTC تنظیم شده باشد، در حالی که شما زمان ایران را هنگام تعریف Cron Job در نظر گرفته باشید. این موضوع بهخصوص در سرورهایی که در دیتاسنترهای کشورهای مختلف قرار دارند اهمیت دارد.
تفاوت Crontab کاربر با /etc/crontab
Crontab معمولی کاربر که با دستور زیر ویرایش میشود:
Copy
crontab-e
Bash
دارای پنج فیلد زمان و سپس دستور است:
Copy
minutehourdaymonthweekdaycommand
Bash
اما /etc/crontab یک Crontab سیستمی است و علاوه بر زمان، فیلدی برای مشخص کردن User نیز دارد.
برای مثال:
Copy
03***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 یا دیتابیس سرور را تحت فشار قرار دهد.
اگر هنوز با ساختار پنج فیلدی Cron آشنایی کامل ندارید، ابزار Crontab Guru میتواند Expressionهای Cron را به زبان ساده برای شما تفسیر کند.
برای مثال عبارت:
Copy
*/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های سرور را ببینیم؟
برای مشاهده Cron Jobهای کاربر جاری از دستور زیر استفاده کنید:
crontab -l
چگونه Cron Job جدید ایجاد کنیم؟
دستور زیر را اجرا کنید:
crontab -e
سپس Expression زمانبندی و دستور موردنظر را به انتهای فایل اضافه کنید.
چگونه یک دستور را هر 5 دقیقه اجرا کنیم؟
از Expression زیر استفاده کنید:
*/5 * * * * /path/command
چرا Cron Job اجرا نمیشود؟
رایجترین دلایل شامل اشتباه بودن Syntax، غیرفعال بودن سرویس Cron، Permission نامناسب، استفاده نکردن از Absolute Path، تفاوت Environment، Timezone اشتباه یا بروز خطا در خود Script هستند.