گاهی اوقات لازم است کاری را در زمان مشخص یا به صورت دورهای انجام دهیم؛ مثل ارسال گزارشها، گرفتن لاگ یا تهیهی بکاپ از فایلهای سیستم. انجام این کارها بهصورت دستی، بهخصوص زمانی که تکراری هستند، هم زمانبر است و هم ممکن است فراموش شوند. برای مثال فرض کنید میخواهیم هر شب ساعت ۱ بامداد از فایلهای مهم سیستم بکاپ بگیریم، وضعیت سیستم را برای ادمین ایمیل کنیم یا یک اسکریپت خاص را اجرا کنیم؛ واضح است که انجام این کارها به صورت دستی چندان منطقی نیست و با کوچکترین غفلت ممکن است مشکلات جدی ایجاد شود.اینجاست که ابزارهای زمانبندی در لینوکس به کمک ما میآیند. با استفاده از این ابزارها میتوان اجرای وظایف مختلف را در زمان مشخص و به صورت کاملاً خودکار انجام داد. در ادامهی این آموزش، با روشها و ابزارهای متداول زمانبندی تسکها در لینوکس آشنا میشویم و کاربرد آنها را در سناریوهای واقعی بررسی میکنیم.
پیشنیازها
- آشنایی با کامندلاین(Command line)
- آشنایی ابتدایی با ساختار فایل های لینوکس مانند /var و /etc
- داشتن دسترسی root
- آشنایی با مجازی سازها در صورت استفاده
ابزارها
- Cron/Crontab برای تعریف و زمانبدی تسک ها
- AT برای اجرای یکباره دستورات در زمان مشخص
- Systemcd Timers برای سناریو های حرفه ای و یکپارچه با sytecmd
زمانبندی تسک ها با Cron
بیشک یکی از محبوب ترین و قدیمی ترین ابزارهای زمانبدی در سیستم عامل لینوکس، cron میباشد. با استفاده از این سرویس میتوانیم تسک ها را در بازه های زمانی مختلف و به صورت خودکار اجرا کنیم.
نصب و فعال سازی cron
cronدر اکثر توزیع های لینوکس، به صورت پیشفرض نصب شده است. اگر در سیستم شما نصب نبود میتوان آنرا به شکل زیر نصب کرد :
Debian/Ubuntu :
sudo apt update
sudo apt install cron
CentOS/RHEL :
sudo dnf update
sudo dnf install corni
در دبیان سرویس cronپس از نصب به صورت خودکار اجرا میشود اما در CentOS/RHEL برای فعال کردن و اجرای آن ، از دستورات زیر استفاده کنید.
sudo systemctl enable crond
sudo systemctl start crond
“در توزیع های Debian-baseنام سرویس cron است و در CentOS/RHEL ، crond نام دارد. ”
مشاهده و ویرایش جاب ها
مشاهده جاب های کاربر:
crontab -l
ویرایش یا افزودن جاب جدید:
crontab –e
اگر برای اولین بار از crontab -e استفاده میکنید، از شما میخواهد که یک ویرایشگر متن را انتخاب کنید.
ساختار دستور cron
فرمت کلی کران جاب ((cron job به این صورت است:
| توضیح | مقدار | عبارت |
| دقیقه اجرا شدن تسک | 0 - 59 | Min |
| ساعت اجرا شدن تسک | 0-24 | Hour |
| روز اجرا شدن تسک در ماه | 1 - 31 | Day of month |
| ماه اجرا شدن تسک | 1 - 12 یا بر اساس نام March, April | Month |
| روز اجرا شدن تسک در هفته | 0 - 7 یا براساس نام Sunday, Monday | Day of week |
| دستور یا اسکریپت که میخواهیم زمانبدی کنیم | نام دستور مثلا ping یا محل اسکریپت | Command |
: به جای مقدار های بالا میتوان از مقادیر زیر برای کاربری های خاص نیز استفاده کرد
* : هر موردی مثلا اگر به عنوان مقدار برای فیلد hour قرار بگیرد به این معنیست که تسک در هر ساعتی اجرا شود. کاربردش را جلوتر خواهیم دید.:
: / فاصله زمانی : برای مثال اگر 20/ به عنوان مقدار فیلد min در نظر گرفته شود، تسک ما هر 20 دقیقه اجرا میشود ( فرض میکنیم که فیلد های دیگر همگی مقدار * دارند)
-: برای مشخص کردن یک بازه بکار میرود. مثلا 20-10 به عنوان مقدار min یعنی از دقیقه 10 تا دقیقه 20 تسک اجرا میشود.
برای اجرای تسک در زمان بوت شدن سیستم: @reboot
“درنظر داشته باشید که روز 7 و 0 در تاریخ میلادی، یکشبه میباشد”
مثال کاربردی cron (اسکریپت بک آپ)
خب بریم باهم اسکریپت بک اپ رو زمانبندی کنیم. میخواهیم که اسکریپت ما هر شب ساعت 10:30 اجرا شود:
30 22 * * * /usr/local/bin/backup.sh
زمانبندی سیستم با دایرکتوری های crontab.
یکی دیگر از راه های زمانبدی تسک ها استفاده از دایرکتوری های از پیش ساخته شده /etc/crontab/ است که زمان اجرای تسک درپسوند نام دایرکتوری مشخص شده است(تصویر زیر). این دایرکتوری ها در توزیع های Debian-base و CentOS-RHEL به صورت پیشفرض وجود دارند
مثلا اگر بخواهیم اسکریپت بک اپ روزانه اجرا شود، میتونیم آن را در دایرکتوری /etc/crontab.daily قرار بدیم.
زمانبندی سیستم با etc/crontab و etc/cron.d
اگر بخواهیم تسکی برای کل سیستم(system-wide) و نه فقط برای یک کاربر خاص زمانبندی و اجرا شود، از فایل crontab.d یا دایرکتوری cron.d استفاده میکنیم. فایل crtontab از لحاظ ساختاری بسیار شبیه به ساختار crontab -e دستور کاربران است با این تفاوت که یک فیلد اضافه برای مشخص کردن کاربر نیز وجود دارد.
مثال با اسکریپت بک آپ:
برای مثال میخواهیم که اسکریپت بک آپ ما در ساعت 22:30 و هرروز اجرا شود. برای اینکار با استفاده از یک ویرایشگرخط زیر را به فایل crontab اضافه میکنیم.
30 22 * * * root /usr/local/bin/backup.sh
دستور at
تصور کنید نیاز دارید یک دستور رو فقط یک بار در زمان مشخص انجام دهید. در این صورت چطور؟ آیا همچنان هم باید از cronاستفاده کنید؟ پاسخ به این سوال، خیر است و استفاده از سرویس cron چندان منطقی نیست و ابزار at گزینه بهتری برای انجام این کار است.
نصب و راه اندازی At
Debian/Ubuntu :
sudo apt install at
CentOS/RHEL :
sudo dnf install at
پس از نمایش اطلاعاتی مثل پیشنیازهاو سایز پکت دانلودی، با وارد کردن حرفy فرآیند نصب رو تایید کنید
فعال سازی at در CentOS/RHEL
ممکن پس از نصب نیاز به فعال سازی دستی باشد:
sudo systemctl enable -–now atd
فرمت های پرکاربرد at
زمان مشخص:
At 22:30
زمان به همراه تاریخ :
at 20:30 1.2.2025
یا
at 22:30 Dec 20
استفاده از زمان نسبی :
At now + 2 hours
at now + 20 minutes
مثال عملی at (خاموش کردن سیستم)
تصور کنید میخواهید در زمان مشخصی، مثلا ساعت 10:45 شب میخواهید که سیستم شما خاموش شود. بیاید این فرآیند رو با دستور at پیاده سازی کنیم.
ابتدا دستور at همراه با زمان را اجرا کنید.
at 22:45
وسپس دستور shutdown -h now را وارد کنید.
و با کلید های ctrl+d تسک را ثبت میکنیم.
یا اگر میخواستیم تسکی 30 دقیقه دیگر اجرا شود، میتوانیم اینطور دستور را استفاده کنیم.
at now + 30 minuets
مدیریت جاب ها (job) در at
مشاهده لیست جاب ها :
atq
حذف جاب ها :
atrm <job-number>
زمانبندی تسک ها با systemd timers
در سیستمهایی که از systemd استفاده میکنند، میتوان از systemd timers بهعنوان جایگزین پیشرفته cron استفاده کرد. این روش برای محیطهای حرفهای و سرورمحور مناسبتر است.این روش نسبت به روش های قبلی از پیچیدگی بیشتری برخوردار است.
سناریوی اسکریپت بکاپ
ساخت سرویس یونیت service unit
ابتدا باید یک سرویس برای تسک خودمون ایجاد کنیم. با استفاده از دستور touch یک سرویس یونیت در مسیر /etc/systemd/system/
ایجاد میکنیم.
محتویات سرویس یونیت
در سرویس یونیتی که ساختیم عبارت ها و مقادیر زیر را وارد میکنیم.
[Unit]
Description=Daily Backup Script
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
ساخت تایمر یونیت timer unit
در مسیر /etc/systemd/system با دستور touch فایلی به نام backup.timer ایجاد میکنیم.
محتویات تایمر یونیت timer unit
در فایل backup.timer عبارات و مقادیر زیر را وارد کنید.
[Unit]
Description=Run backup script daily
[Timer]
01:00:00
Persistent=true
[Install]
WantedBy=timers.target
فعال سازی timer
برای فعال سازی تایمر مربوط به اسکریپت بک اپ از دستورات زیر استفاده میکنیم.
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
بررسی وضعیت timer
sudo systemctl status backup.timer
sudo systemctl list-timers
"همانطور که مشاهده کردید پیکربندی systemd timers نسبت به cron تنظیمات پیچیده تری دارد و در این مقاله ما یک سناریوی ساده را بررسی کردیم."
خلاصه و جمع بندی
cron: مناسب وظایف ساده و تکراری.
at : مناسب اجرای یکباره تسک ها.
: systemd timersمناسب سناریو های حرفه ای و سرویس محور.
در این آموزش تمرکز اصلی بر cron و at بود و system timers در قالب یک سناریوی ساده معرفی شد.
مشکلات متداول
اسکریپت اجرا نمیشود.(عدم مجوز اجرایی)
اگر اسکریپت ما مجوز اجرایی نداشته باشد، نمیتواند اجرا شود و هیچ کدام از روش های توضیح داده شده در این آموزش کار نخواهند کرد.
راه حل:
بررسی مجوز فایل با دستور ls –l <file> و اعطای مجوز اجرایی به آن با دستور chmod :
chmod +x <script>
استفاده از مسیر نسبی
در محیط های cron متغیر های محیطی محدود هستند و مسیر های نسبی معمولا با خطا مواجه میشوند.
راه حل :
به جای استفاده از ./<script> از مسیر مطلق آن مثلا /usr/local/bin/<script.sh> استفاده کنیم.
سرویس کرون یا at فعال نیست.
اگر سرویس های مربوطه فعال نباشند، هیچ تسکی اجرا نخواهد شد.
بررسی وضعیت cron :
: Debian/Ubuntu
sudo systemctl status cron
: CentOS/RHEL
sudo systemctl status crond
و فعال سازی آنها با
Debian/Ubuntu
sudo systemctl enable cron
sudo systemctl start cron
CentOS/RHEL
sudo systemctl enable crond
sudo systemctl start crond
بررسی وضعیت at
sudo systemctl status atd
فعال سازی atd
sudo systemctl enable atd
sudo systemctl start atd
طیف گسترده ای از مشکلات مربوط به زمانبندی تسک ها به مجوزها، مسیرها و وضعیت سیستم ها مربوط میشود و با بررسی این موارد قابل حل هستند.
نظرات کاربران (0)