در بسیاری از سناریوهای مدیریتی و سیستمی، نیاز داریم برخی دستورات یا برنامهها بهصورت خودکار و در بازههای زمانی مشخص اجرا شوند. برای مثال ممکن است بخواهید هر روز از پوشه etc/ بکاپ بگیرید، یا ماهی یکبار به یک دیوایس خاص متصل شوید و عملیات بهروزرسانی را انجام دهید.
در لینوکس، ابزار قدرتمندی به نام cron برای زمانبندی اجرای تسکها وجود دارد. در این مقاله، بهصورت کامل با روشهای مختلف استفاده از cron، ساخت cron jobها و نکات مهم آن آشنا میشویم.
زمانبندی با استفاده از دایرکتوریهای cron
سادهترین روش استفاده از cron، قرار دادن یا لینک کردن اسکریپتها در دایرکتوریهای مشخصی است که از قبل در سیستم تعریف شدهاند.
cron چند پوشه استاندارد در مسیر etc/ دارد که هرکدام اسکریپتهای داخل خود را در بازههای زمانی مشخص اجرا میکنند:
-
/etc/cron.hourly/
اسکریپتهای داخل این پوشه، هر یک ساعت یکبار اجرا میشوند. -
/etc/cron.daily/
فایلهای موجود در این دایرکتوری بهصورت روزانه اجرا خواهند شد. -
/etc/cron.weekly/
اسکریپتها هفتهای یکبار اجرا میشوند. -
/etc/cron.monthly/
فایلهای داخل این پوشه بهصورت ماهانه اجرا خواهند شد.

بهترین روش استفاده
پیشنهاد میشود بهجای کپی کردن فایلها داخل این دایرکتوریها، تنها یک لینک (Symbolic Link) از اسکریپت اصلی ایجاد کنید. این کار مدیریت و ویرایش اسکریپتها را بسیار سادهتر میکند. فرض کنید اسکریپتی با نام MyScript.sh در مسیر زیر دارید و میخواهید هر ساعت اجرا شود:
ln -s ~/.local/bin/MyScript.sh /etc/cron.hourly
به همین روش میتوانید برای دایرکتوریهای دیگر cron نیز لینک ایجاد کنید.
اجرای اسکریپت با دسترسی root
اگر اسکریپت شما نیاز دارد با دسترسی کاربر root اجرا شود، کافی است مالک فایل را به root تغییر دهید:
sudo chown root:root MyScript.sh
مدیریت سرویس cron
cron یک سرویس سیستمی است و بهراحتی میتوانید آن را فعال یا غیرفعال کنید. برای مثال، برای غیرفعال کردن cron از دستور زیر استفاده میشود:
sudo systemctl disable cron.service
اهمیت Shebang در اسکریپتها
اگر اسکریپتی مینویسید که قرار است توسط cron اجرا شود، حتماً در خط اول آن Interpreter را با استفاده از shebang مشخص کنید.
مثلاً اگر اسکریپت شما با Python 3 نوشته شده است:
#!/bin/python3
این کار به cron اعلام میکند که اسکریپت باید با چه مفسری اجرا شود.
زمانبندی دقیق با استفاده از crontab
علاوه بر دایرکتوریهای آماده، cron امکان زمانبندی دقیقتری را از طریق crontab فراهم میکند. هر کاربر میتواند cron jobهای مخصوص به خود را تعریف کند و این تسکها با سطح دسترسی همان کاربر اجرا خواهند شد.
برای ویرایش crontab کافی است دستور زیر را اجرا کنید:
crontab -e
با اجرای این دستور، فایلی در مسیر /etc/spool/cron/crontabs ساخته میشود. در اولین اجرا، از شما خواسته میشود ویرایشگر پیشفرض را انتخاب کنید. پس از آن، وارد صفحهای میشوید که توضیحات cron بهصورت کامنت نمایش داده شدهاند و در انتهای فایل، این ساختار را مشاهده میکنید:
ساختار cron job
هر خط در فایل crontab یک تسک مجزا محسوب میشود. اگر چند تسک دارید، باید هرکدام را در یک خط جداگانه بنویسید. ساختار کلی هر خط شامل ۶ بخش است که تمام این بخشها با فاصله (space یا tab) ازهم جدا میشوند.
| m | دقیقه |
| h | ساعت |
| dom | روز ماه |
| mon | ماه |
| dow | روز هفته |
| command | دستور یا اسکریپت موردنظر |
استفاده از علامت ستاره (*)
علامت * در cron به معنی «هر» است. برای مثال:
* * * * * mkdir testy
این دستور، در هر دقیقه، از هر ساعت، در هر روز، هر ماه و هر روز هفته اجرا خواهد شد. توجه داشته باشید که استفاده نادرست از * میتواند باعث اجرای بیشازحد یک دستور شود. اگر بخواهید دستوری هر ۱۰ دقیقه یکبار اجرا شود، میتوانید از دو روش استفاده کنید. توجه کنید cron بر اساس زمان سیستم اجرا میشود، نه زمانی که فایل crontab را ذخیره میکنید.
میانبرهای زمانی (Shortcuts)
cron برای زمانهای پرکاربرد، میانبرهایی تعریف کرده است:
| @yearly | اجرای سالانه |
| @mounthly | اجرای ماهانه |
| @weekly | اجرای هفتگی |
| @daily | اجرای روزانه |
| @hourly | اجرای ساعتی |
بکاپگیری خودکار با cron و اسکریپت
برای انجام عملیاتهایی مثل بکاپ، بهتر است دستورات را داخل یک اسکریپت قرار دهید و مسیر اسکریپت را به cron بدهید. در اسکریپت میتوانید متغیری تعریف کنید که تاریخ و ساعت اجرای بکاپ را ذخیره کند و از آن برای نامگذاری فایل بکاپ استفاده نمایید. این کار مدیریت و بازیابی بکاپها را بسیار سادهتر میکند. پس از ساخت اسکریپت، حتماً دسترسی اجرایی به آن بدهید:
chmod +x theScript
نکته مهم درباره PATH در cron
متغیر محیطی path در cron بسیار محدودتر از محیط shell معمولی است. PATH پیشفرض در cron معمولاً فقط شامل مسیرهای /bin و /usr/bin است
پرسشهای متداول
cron چیست و چه کاربردی دارد؟
cron یک سرویس زمانبندی در سیستمعامل لینوکس است که به شما اجازه میدهد دستورات، اسکریپتها یا برنامهها را بهصورت خودکار و در بازههای زمانی مشخص اجرا کنید. این ابزار بیشتر برای کارهایی مانند بکاپگیری، مانیتورینگ، پاکسازی فایلها و بهروزرسانیهای دورهای استفاده میشود.
تفاوت استفاده از crontab و دایرکتوریهای cron چیست؟
دایرکتوریهای cron مانند cron.daily یا cron.hourly برای زمانبندیهای ساده و از پیش تعریفشده مناسب هستند. اما crontab امکان تنظیم دقیقتر زمان اجرا (دقیقه، ساعت، روز هفته و…) را فراهم میکند و انعطافپذیری بیشتری دارد.
آیا cron jobها با دسترسی root اجرا میشوند؟
خیر، cron jobها با سطح دسترسی همان کاربری اجرا میشوند که آنها را تعریف کرده است. مگر اینکه اسکریپت داخل دایرکتوریهای سیستمی cron قرار داده شده باشد یا مالک فایل به root تغییر داده شده باشد.
چرا اسکریپت من در cron اجرا نمیشود ولی بهصورت دستی اجرا میشود؟
این مشکل معمولاً به دلیل تفاوت متغیر محیطی PATH در cron و محیط shell است. cron فقط مسیرهای محدودی را بررسی میکند. برای رفع این مشکل باید مسیر کامل دستورات را بنویسید یا متغیر PATH را داخل اسکریپت مشخص کنید.
آیا cron بلافاصله بعد از ذخیره فایل اجرا میشود؟
خیر، cron jobها بر اساس زمان سیستم اجرا میشوند، نه زمان ذخیره فایل crontab. بنابراین اجرای تسکها دقیقاً مطابق با زمانبندی تعریفشده خواهد بود.
جمعبندی
cron یکی از ابزارهای بسیار قدرتمند و کاربردی در لینوکس است که امکان اجرای خودکار تسکها را بدون نیاز به دخالت کاربر فراهم میکند. با استفاده از دایرکتوریهای آماده cron میتوان زمانبندیهای ساده را بهراحتی پیادهسازی کرد و با crontab، کنترل دقیقتری روی زمان اجرای دستورات داشت.
شناخت ساختار cron jobها، توجه به سطح دسترسی کاربران، استفاده صحیح از shebang در اسکریپتها و درک تفاوت متغیر PATH در cron از جمله نکاتی هستند که باعث میشوند تسکهای زمانبندیشده بدون خطا اجرا شوند.
در نهایت، اگر cron بهدرستی و با دقت پیکربندی شود، میتواند نقش مهمی در اتوماسیون، بکاپگیری منظم، افزایش پایداری سیستم و کاهش خطای انسانی در مدیریت سرورهای لینوکسی ایفا کند.