6 تیر 1400
گاهی نیازه تا هرچند وقت یک بار یک برنامه یا دستور خاصی را به صورت خودکار اجرا کنیم. مثلا ممکن است نیاز باشد تا هر روز یک بکاپ کامل از پوشه /etc بگیریم. یا مثلا ممکن است نیاز شود تا هر ماه به یک دیوایس متصل بشید و یک سری اپدیت رو دریافت کنید.
برای زمان بندی، یکی از ابزار هایی که زیاد استفاده میشه cron هست. در این مقاله نحوه استفاده از این ابزار را توضیح میدهیم.
ساده ترین راهی که میشود از cron برای زمان بندی تسکها استفاده کرد این است که فایل اسکریپت را داخل پوشههای مشخص شده cron قرار داده یا لینک کنیم.
درواقع cron چند دایرکتوری در /etc قرار داده است. هر کدام از این دایرکتوری ها اسکریپت ها را در بازه های مشخصی اجرا میکنند. این دایرکتوری ها شامل:
/etc/cron.hourly
که فایلهای داخل این پوشه هر ساعت اجرا خواهند شد.
/etc/cron.daily
و این دایرکتوری که فایلها را روزانه اجرا میکند
/etc/cron.weekly
که هر هفته فایل های این پوشه اجرا می شود
/etc/cron.monthly
و فایل های داخل این دایرکتوری هم هر ماه اجرا خواهند شد.
پیشنهاد میکنیم برای اینکه از این قابلیت استفاده کنید، فایل های خود را داخل پوشهها منتقل یا کپی نکنید. کافی است فقط لینکشون کنید.
برای لینک کردن هم کافی است از کامند ln اسنفاده کنید. فرض کنید یک اسکریپت داخل پوشه ~/.local/bin/MyScript.sh داریم که میخواهیم هر ساعت اجرا شود:
ln -s ~/.local/bin/MyScript.sh /etc/cron.hourly
و به همین ترتیب به راحتی میشود برای دیگر دایرکتوری ها اینگونه عمل کرد.
اگر که اسکریپتی باید با دسترسیهای یوزر root اجرا شود کافی است با کامند chown مالک(owner) فایل را به یوزر root تغییر دهید.
sudo chown root:root MyScript.sh
دقت کنید که cron یک سرویس هست که به راحتی میتونید فعال/غیر فعال کنید. برای غیر فعال کردن cron:
sudo systemctl diable cron.service
و نکته اخر این که سعی کنید اگه اسکریپتی مینویسید در خط اول اسکریپت Interperter را با Shebang مشخص کنید. مثلا اگر که اسکریپتی با پایتون 3 نوشید باید خط اول را اینطوری بنویسید:
#/bin/python3
اما cron یک راه دیگری برای تنظیم کردن دقیقتر تسکها هم دارد. هر یوزر میتواند برای زمان بندی کردن تسکها از cron استفاده کند. فقط دقت کنید که تسکها با دسترسی های خود یوزر اجرا خواهد شد. برای نوشتن cron کافی است دستور crontab -e را در ترمینال بزنید.
به ازای هر یوزر که crontab را اجرا کند یک فایل در: /var/spool/cron/crontabs/ ساخته خواهد شد که میشود با ادیتور فایل را تغییر دهید. با زدن کامند crontab -e با یک صفحه مواجه شده که از شما میخواهد ادیتور پیشفرض را انتخاب کنید.
بعذ از اینکه ادیتور را انتخاب کردید، وارد یک صفحه میشوید که تمامی متن به صورت کامنت درآورده شده است. این متن توضیحات استفاده از کرون است. میتوانید همه متن را پاک کنید اما فقط خط اخر را نگه دارید.
در خط اخر شما چنین نوشتهای را مشاهده میکنید:
m h dom mon dow command #
همینطور که مشاهده میکنید این متن یک راهنما برای زمانهای cron است. هر خط در این فایل به عنوان یک تسک مجزا است. در واقع اگر میخواهید دو تسک را زمانبندی کنید باید تسکها را در دو خط مجزا بنویسید.
ما در هر خط 6 داده داریم که هر داده با وایت-اسپیس از هم جدا میشوند. هر وایت-اسپیس میتواند یک تب یا فقط یک اسپیس باشد. از این 6 داده، پنج داده اول(از سمت چپ) مربوط به فاصله زمانی است و اخرین داده، کامندی است که باید اجرا شود.
به ترتیب از سمت چپ
m h dom mon dow command #
دقیقه m
ساعت h
چندمین روز ماه dom
ماه mon
روز هفته dow
کامند command
مثلا اگر که بخواهید در هر دقیقه یک کامند اجرا شود باید به این صورت بنویسید:
ستاره در cron به معنی ‘هر’ است. درواقع با این جابی(job) که برای cron تعریف کردیم در ‘هر دقیقه’ از ‘هر ساعت’ از ‘هر روزی از ماه’ در ‘هر ماهی’ توی ‘هر روزی از هفته’ کامند ساخت پوشه را اجرا خواهد کرد. اما دقت کنید که فقط * به معنی ‘هر’ است و ما وقتی از عدد استفاده کنیم دقیقا به زمانی که مشخص کردهایم اشاره میکنیم.
مثلا فرض کنید میخواهیم هر هفته یک بکاپ کامل از پوشه /home بگیریم. برای اینکار cron را باید به این شکل نوشت:
در این جاب که تعریف کردیم در واقع ما گفتیم ‘دقیقا در ساعت 5’ از ‘هر روزی از ماه که بود’. ‘هر ماهی که بود’. در ‘روز اول هفته’ کامند را اجرا کن.
همانطور که میبینید عدد دقیقا اشاره داره به زمانی که ما مشخص میکنیم. عدد 0 در جایگاه دقیقه به این معنی هست که دقیقا ساعت 5AM کامند را اجرا کن. اگر بجای 0 شما * بگذارید، کامند در هر دقیقه از ساعت 5 صبح اجرا خواهد شد. این یعنی دقیقا 60 بار کامند را اجرا میکنید!
نکته: در cron روز اول هفته روز دوشنبه است.
اگر جایی نیاز بود که کامندی را هر ده دقیه یک بار اجرا کنید، کافی است از ‘کاما’ در جایگاه دقیقه استفاده نمایید. برای مثال:
البته cron یک سینتکس دیگری نیز برای این کار دارد که شما میتوانید هر ده دقیقه را مشخص کنید. کافی است از اسلش(/) استفاده نمایید.
فراموش نکنید که تسکها بر اساس زمانی که شما فایل را ذخیره میکنید اجرا نمیشوند. در واقع بر اساس زمان سیستم شما اجرا میشوند. مثلا اگر الان ساعت 8 باشد، این کامند هر ده دقیه اجرا خواهد شد که از 8:00 شروع شده، بعد 8:10، 8:20 و… .
cron چند میانبر برای زمانهایی که بیشتر استفاده میشوند هم تعیین کرده که هر کدام از این میانبرها به یک زمان خاصی اشاره میکنند.
reboot@
کامند جلوی این میانبر، بعد از هربار روشن شدن سیستم اجرا میشود
yearly@
همانطور که از اسم آن مشخص است، کامندهای این میانبر سالانه اجرا میشوندmonthly@
هر ماه یک بار کامندها اجرا خواهند شد
weekly@
هفتهای یک بار اجرا میشوند
daily@
روزانه اجرا خواهند شد
hourly@
هر یک ساعت اجرا میشوند
در واقع برای این که یک بکاپ بگیرید کامندهایی زیادی هست که باید بنویسید که نوشتن آنها درون فایل cron در بعضی از موارد اشتباه است!
ما درون اسکریپ یک متغییر تعریف میکنیم که تاریخ و ساعت لحظه بکاپ درون آن ذخیره شده و در نهایت از این متغییر برای نام فایل بکاپ استفاده میکنیم. به این ترتیب میتوانیم به راحتی فایلهای بکاپ را بر اساس تاریخ ساخت تفکیک و بازیابی کنیم.
این اسکریپت در هر بار اجرا یک بکاپ از پوشه home خواهد گرفت. کافی است مسیری که فایل اسکریپ را ذخیره کردیم به cron بدهیم.
دقت کنید که به فایل اسکریپتتون دسترسی اجرایی را بدهید.
chmod +x theScript
با این کار روز اول هر هفته ساعت 12AM اسکریپت من اجرا خواهد شد.
همانطور که میدانید ما یک متغییر محیطی داریم به اسم PATH که مسیر اجرای برنامهها داخلش ثبت شده است. حالت پیشفرض متغیر PATH برای ما به این شکل است:
/home/loading/.local/bin /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /snap/bin /snap/bin
هر کامندی که وارد کنیم، bash درون این پوشهها به دنبال برنامه میگرده و سپس آن را اجرا میکند اما این متغیر PATH در cron به این صورت هست:
/user/bin /bin
این نشان میدهد که اگر کامندی وارد کردید که برنامه آن کامند در این دو پوشه وجود نداشته باشد، cron نخواهد توانست کامند را اجرا کند. برای اینکه مطمئن شوید کامند شما در این مسیر هست، کافی است این دستور را اجرا کنید:
which TheCommand
جای command دستور خود را بنویسید. خروجی این دستور به شما مسیری که برنامه از آن اجرا میشود را نشان میدهد.
برای رفع این مشکل دو راه کار داریم
تمامی حقوق برای گیتی سرور محفوظ است.