گاهی اوقات لازم است کاری را در زمان مشخص یا به صورت دوره‌ای انجام دهیم؛ مثل ارسال گزارش‌ها، گرفتن لاگ یا تهیه‌ی بکاپ از فایل‌های سیستم. انجام این کارها به‌صورت دستی، به‌خصوص زمانی که تکراری هستند، هم زمان‌بر است و هم ممکن است فراموش شوند. برای مثال فرض کنید می‌خواهیم هر شب ساعت ۱ بامداد از فایل‌های مهم سیستم بکاپ بگیریم، وضعیت سیستم را برای ادمین ایمیل کنیم یا یک اسکریپت خاص را اجرا کنیم؛ واضح است که انجام این کارها به صورت دستی چندان منطقی نیست و با کوچک‌ترین غفلت ممکن است مشکلات جدی ایجاد شود.اینجاست که ابزارهای زمان‌بندی در لینوکس به کمک ما می‌آیند. با استفاده از این ابزارها می‌توان اجرای وظایف مختلف را در زمان مشخص و به صورت کاملاً خودکار انجام داد. در ادامه‌ی این آموزش، با روش‌ها و ابزارهای متداول زمان‌بندی تسک‌ها در لینوکس آشنا می‌شویم و کاربرد آن‌ها را در سناریوهای واقعی بررسی می‌کنیم.

پیشنیازها

  • آشنایی با  کامندلاین(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 به این صورت است:

 

Min – Hour – Day – Month – Day of week - Command

 

توضیح مقدار  عبارت
دقیقه اجرا شدن تسک  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

 

طیف گسترده ای از مشکلات مربوط به زمانبندی تسک ها به مجوزها، مسیرها و وضعیت سیستم ها مربوط میشود و با بررسی این موارد قابل حل هستند.