مقدمه

در طول این فصل، ما تمام ابزارهای لازم برای اسکریپت‌نویسی را فرا گرفتیم: متغیرها برای ذخیره‌سازی داده، شرط‌ها (if) برای تصمیم‌گیری، حلقه‌ها (for و while) برای تکرار و توابع برای سازماندهی کد. اکنون می‌توانیم اسکریپت‌های پیچیده و مفیدی بنویسیم. اما هدف نهایی از اسکریپت‌نویسی، رسیدن به اتوماسیون است؛ یعنی کاری کنیم که کامپیوتر وظایف را بدون دخالت ما و به صورت خودکار انجام دهد.

یک اسکریپت، هر چقدر هم که هوشمند باشد، تا زمانی که ما آن را به صورت دستی اجرا نکنیم، کاری انجام نمی‌دهد. اما اگر بخواهیم یک اسکریپت به صورت خودکار هر شب ساعت ۲ بامداد اجرا شود تا از فایل‌های مهم ما پشتیبان بگیرد چه؟ اینجاست که آخرین قطعه از پازل اتوماسیون وارد می‌شود: زمان‌بند Cron. در این درس، تمام آموخته‌های خود را در قالب یک اسکریپت کاربردی جمع‌بندی کرده و سپس یاد می‌گیریم چگونه اجرای آن را با cron زمان‌بندی کنیم.

یک مثال عملی: اسکریپت پشتیبان‌گیری خودکار

بیایید یک اسکریپت بنویسیم که از یک دایرکتوری مشخص یک نسخه‌ی پشتیبان فشرده تهیه کرده و نتیجه‌ی عملیات (موفقیت یا شکست) را در یک فایل گزارش ثبت کند. این اسکریپت تقریباً از تمام مفاهیمی که یاد گرفته‌ایم استفاده می‌کند.

#!/bin/bash

SOURCE_DIR="/home/me/Documents"
BACKUP_DIR="/home/me/backups"
LOG_FILE="$BACKUP_DIR/backup.log"

log_message() {
  local message="$1"
  echo "$(date +'%Y-%m-%d %H:%M:%S') - $message" >> "$LOG_FILE"
}

mkdir -p "$BACKUP_DIR"

log_message "starting backup process..."

FILENAME="docs-backup-$(date +%Y-%m-%d).tar.gz"
BACKUP_PATH="$BACKUP_DIR/$FILENAME"

tar -czf "$BACKUP_PATH" "$SOURCE_DIR"

if [[ $? -eq 0 ]]; then
  log_message "backup completed successfully: $FILENAME"
else
  log_message "error: backup process failed."
fi

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

زمان‌بندی اسکریپت‌ها با Cron

Cron یک سرویس (daemon) استاندارد در سیستم‌های لینوکسی است که در پس‌زمینه اجرا می‌شود و کار آن اجرای دستورات زمان‌بندی شده است. Cron هر دقیقه از خواب بیدار شده و فایلی به نام crontab (مخفف cron table) را بررسی می‌کند تا ببیند آیا دستوری برای اجرا در آن دقیقه وجود دارد یا خیر. هر کاربر می‌تواند crontab مخصوص به خود را داشته باشد.

ویرایش Crontab

برای ویرایش جدول زمان‌بندی خود، از دستور crontab -e استفاده کنید. اولین باری که این دستور را اجرا می‌کنید، ممکن است از شما بخواهد که یک ویرایشگر متن پیش‌فرض (مانند Nano) را انتخاب کنید.

$ crontab -e

ساختار دستورات Crontab

هر خط در فایل crontab یک وظیفه‌ی زمان‌بندی شده را مشخص می‌کند و از شش بخش تشکیل شده است:

# ┌───────────── دقیقه (0 - 59)
# │ ┌───────────── ساعت (0 - 23)
# │ │ ┌───────────── روز ماه (1 - 31)
# │ │ │ ┌───────────── ماه (1 - 12)
# │ │ │ │ ┌───────────── روز هفته (0 - 6) (یکشنبه=0)
# │ │ │ │ │
# * * * * * /مسیر/کامل/دستور/برای/اجرا

کاراکتر ستاره (*) به معنای «هر مقدار ممکن» است. برای مثال، * * * * * به معنای «هر دقیقه از هر ساعت از هر روز و...» می‌باشد.

زمان‌بندی اسکریپت پشتیبان‌گیری

حالا بیایید اسکریپت پشتیبان‌گیری خود را طوری زمان‌بندی کنیم که هر شب ساعت ۲:۳۰ بامداد اجرا شود. خط زیر را به فایل crontab خود اضافه می‌کنیم:

30 2 * * * /home/me/scripts/backup.sh

همیشه از مسیر کامل استفاده کنید!

یک نکته‌ی بسیار حیاتی هنگام کار با cron این است که باید همیشه مسیر کامل (absolute path) را به اسکریپت یا دستور خود بدهید. Cron در یک محیط بسیار محدود و متفاوت از شل تعاملی شما اجرا می‌شود و متغیر $PATH آن ممکن است شامل مسیر اسکریپت‌های شخصی شما نباشد.

مدیریت Crontab

دو دستور مفید دیگر برای کار با crontab وجود دارد:

  • crontab -l: لیست تمام وظایف زمان‌بندی شده‌ی شما را نمایش می‌دهد (list).
  • crontab -r: کل crontab شما را حذف می‌کند (remove). در استفاده از این دستور بسیار مراقب باشید!

برای مشاهده وضعیت سرویس cron و اطمینان از فعال بودن آن، می‌توانید از دستور زیر استفاده کنید:

$ systemctl status cron
                        
اگر سرویس فعال نبود، با دستور زیر آن را راه‌اندازی کنید:
$ sudo systemctl start cron
                        
همچنین برای فعال شدن خودکار سرویس در هنگام بوت:
$ sudo systemctl enable cron