برنامههای زمانبندی کار برای انجام وظایف تکراری طبق یک برنامه تعریف شده بر اساس زمان و شرایط رویداد طراحی شدهاند. در این مقاله نحوه نصب و شروع به استفاده از Cron – محبوبترین ابزار اتوماسیون حجم کار لینوکس که به طور گسترده در جامعه لینوکس استفاده میشود – را خواهید آموخت.
کران چیست؟ #
کرون (Cron) یک زمانبند کار لینوکس است که برای تنظیم وظایف جهت اجرا به صورت دورهای در یک تاریخ یا بازه زمانی ثابت استفاده میشود. کرون جابها دستورات خاص یا اسکریپتهای شل هستند که کاربران در فایلهای crontab تعریف میکنند. سپس این فایلها توسط سرویس کرون (Cron daemon) نظارت میشوند و کارها بر اساس یک برنامه از پیش تعیین شده اجرا میشوند.
پیش نیازها #
برای دنبال کردن این راهنما، باید موارد زیر را داشته باشید:
- دستگاهی که اوبونتو ۲۰.۰۴ روی آن نصب شده و دسترسی روت دارد.
- تجربه اولیه خط فرمان لینوکس.
نصب Cron #
اغلب اوقات Cron به طور پیشفرض روی دستگاه اوبونتو شما نصب شده است. در صورتی که آنجا نباشد، میتوانید خودتان آن را نصب کنید.
لیست بستههای محلی سیستم خود را بهروزرسانی کنید:
sudo apt update
و جدیدترین نسخه cron را نصب کنید. اگر از قبل cron را نصب کردهاید، دستور زیر نیز آن را به آخرین نسخه بهروزرسانی میکند:
sudo apt install cron
تبریک! اکنون آخرین نسخه Cron روی دستگاه شما نصب شده است.
درک نحوه کار کرون #
کارهای کرون، دستورات یا اسکریپتهای شلی هستند که در فایلهای crontab ارجاع داده میشوند. این فایلها در حافظه بارگذاری شده و برای اقدامات از پیش تعیینشدهای که باید انجام شوند، نظارت میشوند. کرون هر دقیقه بیدار میشود تا تمام crontabهای ذخیرهشده را بررسی کند و ببیند آیا دستوری باید در دقیقه فعلی اجرا شود یا خیر.
علاوه بر این، Cron زمان تغییر هر فایل crontab را در سیستم نظارت میکند. اگر هر crontab تغییر کرده باشد، به طور خودکار در حافظه بارگذاری مجدد میشود. به این ترتیب Cron هنگام ایجاد تغییر در crontab نیازی به راهاندازی مجدد ندارد.
💡 نکته حرفهای: کرون فرض میکند که سیستم شما به طور مداوم ۲۴ ساعته و ۷ روز هفته در حال اجرا است، بنابراین برای سرورهایی که باید همیشه آنلاین باشند کاملاً مناسب است. با این حال، cronنمیتواند وظایفی را که برای زمانی برنامهریزی شدهاند که سیستم شما آفلاین بوده است، اجرا کند. از آنجایی که این ممکن است برای رایانههای رومیزی مشکلساز باشد، anacronبه جای آن از کرون برای برنامهریزی کارها در فواصل زمانی مشخص تا جایی که زمان روشن بودن دستگاه اجازه میدهد، استفاده کنید.
اولین کرون جاب خود را تنظیم کنید #
هر کار Cron باید در یک crontab مشخص شود – یک فایل پیکربندی که با نام جدول Cron نیز شناخته میشود. اولین crontab خود را با استفاده از crontabدستوری با گزینهای -eکه مخفف ویرایش است، ایجاد کنید، اما برای نمونهسازی crontab نیز استفاده میشود:
crontab -e

اگر برای اولین بار است که crontab ایجاد میکنید، از شما خواسته میشود ویرایشگر متن پیشفرض خود را انتخاب کنید. ویرایشگر مورد نظر خود [۱ – ۴] را انتخاب کنید و ENTER را فشار دهید تا یک crontab جدید با ویرایشگر متن انتخابی شما باز شود. crontab تازه ایجاد شده با برخی از نظرات مفید پر شده است:

حالا بیایید یک Cron job جدید به انتهای این فایل اضافه کنیم:
* * * * * echo “Hello World at $(date)” >> $HOME/greetings.txt
هر دقیقه این وظیفه Cron دستور را اجرا میکند echo “Hello World at $(date)” >> $HOME/greetings.txt. این دستور تاریخ فعلی را بازیابی میکند، آن را در رشته “Hello World […]” قرار میدهد و رشته را به فایل greetings.txt که در دایرکتوری خانگی شما قرار دارد، اضافه میکند. اگر هنوز وجود نداشته باشد، ایجاد خواهد شد.
فایل را ذخیره کرده و خارج شوید. چند دقیقه صبر کنید و فایل greetings.txt را که باید در دایرکتوری خانگی شما ایجاد شده و با دادههای مرتبط پر شده باشد، بررسی کنید:
tail ~/greetings.txt

همانطور که میبینید، کرون هر دقیقه وظیفهی داده شده را اجرا میکند: زمان فعلی در رشتهی «Hello World […]» قرار داده شده و به انتهای فایل اضافه میشود.
سینتکس Cron Job را درک کنید #
هر وظیفه Cron در یک عبارت Cron نوشته میشود که از دو بخش تشکیل شده است: برنامه زمانی و دستوری که باید اجرا شود. در حالی که دستور میتواند تقریباً هر دستوری باشد که معمولاً در محیط خط فرمان خود اجرا میکنید، نوشتن یک برنامه زمانی مناسب نیاز به کمی تمرین دارد.
سینتکس وظیفه Cron شامل ۶ آرگومان است که با فاصله از هم جدا شدهاند. ۵ آرگومان اول زمان اجرا را توصیف میکنند، در حالی که آرگومان آخر یک دستور یا یک مسیر کامل به یک اسکریپت پوسته است که قرار است توسط پوسته پیشفرض اجرا شود:
[minute] [hour] [day of month] [month] [day of week] [command]
دستورات توسط Cron زمانی اجرا میشوند که فیلدهای دقیقه، ساعت و ماه با زمان فعلی مطابقت داشته باشند، و زمانی که حداقل یکی از فیلدهای روز – چه روز ماه و چه روز هفته – با زمان فعلی مطابقت داشته باشد. مقادیر مجاز عبارتند از:
| میدان | مقادیر مجاز |
|---|---|
| دقیقه | ۰-۵۹ |
| ساعت | ۰-۲۳ |
| روز ماه | ۱-۳۱ |
| ماه | ۱-۱۲ (یا نامها: ژانویه – دسامبر) |
| روز هفته | ۰-۶ (یا نامها: یکشنبه – شنبه) |
همچنین برخی کاراکترهای ویژه وجود دارند که میتوانید برای مشخص کردن زمان اجرا از آنها استفاده کنید:
| مقدار فیلد ویژه | توضیحات | مثال |
|---|---|---|
| ستاره | یک ستاره نشان دهنده هر مقدار مجاز (از اول تا آخر) است. | * (هر ساعت، ماه و غیره اجرا شود) |
| محدوده | یک محدوده شامل دو عدد است که با یک خط تیره از هم جدا شدهاند. | ۰-۵ (از ساعت ۰ تا ۵، ماه و غیره اجرا میشود) |
| فهرست | یک لیست مجموعهای از اعداد یا محدودهها است که با کاما از هم جدا شدهاند. | ۰،۱،۲،۳،۴،۵ (از ساعت ۰ تا ۵، ماه و غیره اجرا میشود) |
| قدم | یک گام (step) همراه با محدودهها یا ستارهها استفاده میشود. | */۲ (هر ساعت، ماه و غیره اجرا شود) |
| نام | میتوان از یک نام در فیلدهای ماه یا روز هفته استفاده کرد. نامها به حروف کوچک و بزرگ حساس نیستند. | ژانویه، فوریه، مارس (هر ساله در ماههای ژانویه، فوریه و مارس برگزار میشود) |
| رشته ویژه | به جای پنج آرگومان اول میتوان از یک رشته خاص استفاده کرد. | @reboot، @weekly (هر بار در هنگام راهاندازی سیستم و یک بار در هفته اجرا میشود) |
شما میتوانید با استفاده از وبسایت crontab.guru با قوانین هدفگذاری زمان اجرا بازی کنید . این وبسایت جای بسیار خوبی برای تعمیق درک شما و بررسی مجدد این است که آیا زمان اجرا را درست تعریف کردهاید یا خیر.
💡 نکته حرفهای: @reboot یک بار در هنگام راهاندازی cron daemon اجرا میشود. به دلیل ترتیب بوت دستگاه، ممکن است این اتفاق قبل از شروع برخی دیگر از daemonهای سیستم رخ دهد. این ممکن است باعث شود برخی از دستورات به درستی کار نکنند.
مدیریت فایلهای پیکربندی Crontab #
Crontab که با نام جدول Cron نیز شناخته میشود، فهرستی از تنظیمات محیطی و دستورات Cron است که در یک فایل ذخیره میشوند و توسط سرویس cron برای اجرای وظایف به صورت زمانبندی شده استفاده میشوند. انواع مختلفی از فایلهای crontab موجود است، بنابراین بیایید آنها را یک به یک بررسی کنیم.
مدیریت فایلهای Crontab متعلق به کاربر #
کاربران فایلهای crontab مخصوص به خود را دارند که در این spoolناحیه ذخیره میشوند و با نام حساب کاربری آنها نامگذاری شدهاند. هر crontab به عنوان کاربری که مالک crontab است اجرا میشود. میتوانید با فهرست کردن تمام فایلهای موجود در دایرکتوری spool، فایلهای crontab متعلق به کاربر را بررسی کنید:
ls /var/spool/cron/crontabs

همانطور که میبینید، در حال حاضر ۳ فایل crontab برای کاربرانی با نامهای root، user1و ایجاد شده است user2.
فایلهای پیکربندی Crontab مربوط به هر کاربر نباید مستقیماً ویرایش شوند، بلکه باید با استفاده از دستور crontab این کار انجام شود. برنامه crontab بدون نیاز به دسترسی root، خود فایل crontab را تأیید و نصب میکند.
شما قبلاً از دستور crontab -e استفاده کردهاید که یک crontab جدید برای یک کاربر ایجاد میکند یا امکان ویرایش crontab موجود را فراهم میکند. میتوانید با استفاده از دستور زیر، محتوای فایل crontab موجود خود را بررسی کنید:
crontab -l

همانطور که میبینید، یک وظیفه فعال Cron وجود دارد که قبلاً اضافه کردهایم.
اگر میخواهید فایل crontab خود را برای خاتمه دادن به تمام وظایف برنامهریزیشدهتان حذف کنید، از دستور زیر استفاده کنید:
crontab -r
مدیریت فایلهای Crontab در سطح سیستم #
فایلهای crontab در سطح سیستم، پس از نصب cron ایجاد میشوند و عمدتاً توسط سرویسهای سیستمی مورد استفاده قرار میگیرند. بستههایی مانند dpkg، sysstat و بسیاری دیگر به cron وابسته هستند و از آن برای زمانبندی وظایف خاص استفاده میکنند. در crontab یک سیستم، یک فیلد کاربر وجود دارد که برای اجرای وظایف داده شده استفاده میشود.
crontab های سیستم باید متعلق به root باشند و هیچ کاربر دیگری نمیتواند آنها را ویرایش کند. هیچ دستور crontab برای ویرایش این فایلها وجود ندارد، بنابراین مدیر سیستم میتواند مستقیماً به آنها دسترسی داشته باشد. اکنون بیایید به crontab اصلی سیستم دسترسی پیدا کنیم:
vim /etc/crontab

همانطور که میبینید، متغیرهای محیطیSHELL و را تعریف کردهایم. همچنین چهار وظیفه Cron وجود دارد که مختص سیستم عاملهای مبتنی بر دبیان هستند. این وظایف از ابزار run-parts برای اجرای تمام اسکریپتهایی که به ترتیب در ، ، ، به صورت ساعتی، روزانه، هفتگی و ماهانه قرار میگیرند، استفاده خواهند کرد.PATH cron.hourly/cron.daily/cron.weekly/cron.monthly/
هر اسکریپتی که در دایرکتوریهای ذکر شده در بالا قرار دارد باید از تأیید بخشهای اجرایی عبور کند. یک اسکریپت باید قابل اجرا باشد، متعلق به root باشد و توسط گروه یا دیگران قابل نوشتن نباشد. اکنون بیایید یک اسکریپت bash ساده ایجاد کنیم که قرار است قیمت بیت کوین را هر ساعت ثبت کند:
vim /etc/cron.hourly/get_bitcoin_price
#!/usr/bin/bash
result=$(curl https://api.coinbase.com/v2/prices/spot?currency=USD)
bitcoin_price=$(jq -r '.data.amount' <<< ${result})
echo "Bitcoin price is $bitcoin_price USD on $(date)" >> $HOME /bitcoin_prices.txt
اسکریپت ما از یک API کوینبیس پرسوجو میکند، اطلاعات قیمت بیتکوین را در قالب JSON دریافت میکند، آن را با برنامه jq تجزیه میکند تا قیمت را به صورت Cherry-Pick انتخاب کند و آن را به همراه تاریخ و زمان فعلی در فایل bitcoin_prices.txt در دایرکتوری home /root ثبت میکند.
اسکریپتی که در /etc/cron.daily/دایرکتوری قرار میدهید میتواند هر اسکریپتی باشد که دوست دارید به صورت ساعتی اجرا شود. فقط فراموش نکنید که مسیر پوسته مورد نظر خود را در بالا ( #!/usr/bin/bash) بنویسید و اسکریپت خود را قابل اجرا کنید:
chmod u+x /etc/cron.daily/get_bitcoin_price
شما میتوانید اسکریپت خود را دوباره بررسی کنید تا مطمئن شوید که قابل اجرا است، متعلق به root است و برای گروه و دیگران قابل نوشتن نیست:
![]()
به نظر میرسد اسکریپت ما به خوبی پیکربندی شده و آماده اجرا توسط Cron به صورت ساعتی است.
همچنین در سیستمهای مبتنی بر دبیان یک دایرکتوری وجود دارد /etc/cron.d/. کرون با تمام فایلهای موجود در این دایرکتوری مانند /etc/crontabفایل اصلی رفتار میکند، با این تفاوت که فایلهای crontab که در /etc/cron.d/ قرار میگیرند، متغیرهای محیطی را بارگذاری نمیکنند. فقط در صورتی که به ایزولهسازی اضافی نیاز دارید، توصیه میشود فایلهای crontab جداگانهای در دایرکتوری /etc/cron.d/ ایجاد کنید.
مدیریت خروجی Cron #
خروجی کارهای cron – چه STDOUT و چه STDERR – به طور پیشفرض به طور خودکار به صندوق پستی محلی مالک crontab ارسال میشود. صندوق پستی هر کاربر یک فایل متنی استاندارد است که در دایرکتوری ذخیره میشود . در صورت نصب بسته /var/mail/، میتوانید مستقیماً یا از طریق دستور mail به آن دسترسی داشته باشید .mailutils
شما میتوانید با تعیین دستورالعمل در فایل crontab خود، رفتار پیشفرض را تغییر دهید MAILTO. برای مثال، اگر میخواهید خروجی وظایف Cron شما به یک کاربر ارسال شود john، باید خط زیر را در بالای crontab خود اضافه کنید:
MAILTO=john
صندوق پستی محلی یک کاربر با ایمیلی که از طریق اینترنت ارسال میشود متفاوت است. اگر میخواهید ایمیلی به خارج از سرور خود ارسال کنید، میتوانید با مشخص کردن دستورالعمل MAILTO به طور مناسب این کار را انجام دهید:
MAILTO=john@gmail.com
البته، اگر از طریق شبکه اینترنت ایمیل ارسال میکنید ، باید نوعی سرور SMTP – Sendmail، Postfix و غیره – روی همان میزبان یا روی شبکه محلی خود داشته باشید.
مدیریت لاگ های کرون #
لاگهای Cron /var/log/syslogبه طور پیشفرض در فایل لاگ سراسری ذخیره میشوند. اگر میخواهید فعالیت Cron خود را ببینید، فایل syslog را فیلتر کنید تا فعالیت سرویس CRON را پیدا کنید:
grep CRON /var/log/syslog

فعالیت فایل Crontab نیز ثبت میشود. اگر میخواهید آن را ببینید، کافیست فایل syslog را به همین ترتیب فیلتر کنید:
grep crontab /var/log/syslog

فیلتر کردن فایل لاگ سراسری هر بار خیلی راحت نیست. یک روش بهتر این است که ابزار rsyslog را طوری پیکربندی کنید که لاگهای cron را در یک فایل جداگانه کپی کند. برای انجام این کار، فایل زیر را ویرایش کنید:
vim /etc/rsyslog.d/50-default.conf
شما باید خط زیر را از حالت کامنت خارج کنید:
cron.* /var/log/cron.log
فایل را ذخیره کنید و rsyslogسرویس را مجدداً راهاندازی کنید تا پیکربندی اعمال شود:
systemctl restart rsyslog
بعد از مدتی باید یک cron.logفایل جدید ایجاد شده در /var/log/دایرکتوری را مشاهده کنید که گزارشهای فعالیت Cron شما در آن قرار دارد:
cat /var/log/cron.log

اگر پیکربندی syslog را تغییر نداده باشید، هر ورودی گزارش از یک الگوی استاندارد پیروی میکند:
[timestamp] [hostname] [app_name] [log_message]
برای مثال، میتوانید ببینید که ردیفهای گزارش از این الگو پیروی میکنند:
Jan 14 15:12:01 ubuntu-sandbox CRON[345431]: (root) CMD (echo "Hello World at $(date)" >> $HOME/greetings.txt)
بیایید این فیلدها را بررسی کنیم:
timestamp=Jan 14 15:12:01– تاریخ و زمان تولید پیام در سیستم را نشان داد.hostname=ubuntu-sandbox– سیستمی را نشان میدهد که پیام را ارسال کرده استapp_name=CRON[345431]– نام و شناسه فرآیند برنامهای که پیام را ارسال کرده است را نشان میدهد.log_message=(root) CMD (echo “Hello World at $(date)” >> $HOME/greetings.txt)– عملی که انجام شده است. در این حالت CRON به ما اطلاع میدهد که cronjob کاربر root زیر اجرا شده است:echo “Hello World at $(date)” >> $HOME/greetings.txt.
💡 نکته حرفهای: شما اطلاعات ثبت وقایع مربوط به اسکریپتهایی که در دایرکتوریها اجرا شدهاند را نخواهید دید /etc/cron.{hourly, daily, weekly, monthly}/، مگر اینکه آن اسکریپتها صریحاً خروجی را به فایل cron.log هدایت کنند.
نظارت بر Cron Jobs با Cronitor #
ممکن است گشتن در لاگهای Cron شما دردسرساز باشد، مخصوصاً اگر صدها کار در سیستم شما در حال اجرا باشد. خوشبختانه، ابزارهای نظارت بر کارهای Cron در بازار موجود است که به شما کمک میکند کارهای cron خود را رصد کنید و به صورت بلادرنگ بینش کسب کنید.
یکی از این ابزارها Cronitor است که وضعیت، معیارها و خروجی هر کار Cron را ثبت میکند. با ابزارهایی مانند Cronitor میتوانید به راحتی هر کار را نامگذاری و سازماندهی کنید، و همچنین مطمئن شوید که در صورت وقوع اتفاقی، به افراد مناسب هشدار داده میشود.
نظارت بر ۵ کرون جاب با Cronitor رایگان است و شروع به کار با آن آسان است. پس از نصب Cronitor CLI و پیکربندی کلید API خود، دستور زیر را اجرا کنید تا crontab های سیستم خود را برای همه کرون جاب های فعال اسکن کنید:
cronitor discover
از شما خواسته میشود که کارهای Cron خود را نامگذاری کنید و پس از اتمام کار، Cronitor بلافاصله شروع به نظارت بر آنها میکند. میتوانید وضعیت کارهای Cron خود را بررسی کرده و هشدارها را در داشبورد Cronitor خود پیکربندی کنید:

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