در این مطلب به اهمیت بکاپ گیری منظم از اطلاعات و ساده سازی و خودکار کردن این فرایند و آموزش زمان‌بندی با cronjob از طریق Terminal در لینوکس میپردازیم. با معرفی ابزارها و روش هایی که کمپانی های بزرگ برای این کار استفاده میکنن بیشتر توی این موضوع عمیق می‌شیم.

سیستم عامل لینوکس اغلب برای مدیریت سرور ها استفاده میشه. توی دنیای IT روز به روز با پیشرفت تکنولوژی وظیفه سرور ها حتی برای کاربران عادی بیشتر قابل لمس شده، از تنظیم سرور برای بازی ماینکرفت یا به عنوان فیلترشکن، تا وظایف سنگین مثل اجرای سیستم های مدیریتی، انبارداری و خیلی چیز های دیگه.

با این حجم بالا از تراکم داده بکاپ گیری، حفظ و نگهداری و بایگانیش، قطعا وظیفه مهم و البته روتین آزاردهنده ایه، مثل تمام روتین ها!

پیش نیازها

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

مفهوم cronjob چیست؟

اگر با کامپیوتر کار سر و کار دارید و توی دنیای IT هستید باید به انگلیسی در حد زبان مادری مسلط باشید، حالا cronjob چیه؟ ترکیب کلمه  job به معنی وظیفه و cron.

آقای Ken Thompson خالق Unix وقتی کلمه chronos که کلمه و پیشوند یونانی برای اشاره به زمان هست رو با غلط املایی cron مینویسه و به همراه job عبارت cronjob خلق میشه. از کلمه crontab هم به همین صورت، tab مخفف table به معنی جدول هست.

به طور کلی ما به هر نوع زمان‌بندی داخل سیستم لینوکس که خودکار برنامه، اسکریپت یا هر چیز دیگه ای رو سر یه ساعت مشخص راه بنداره و اجرا کنه میگیم cronjob، تمام cronjob های ما داخل جدولی قرار میگیرن به اسم crontab.

پس حالا می‌دونیم چرا وظیفه زمان بندی شده cronjob و جدول این زمان بندی ها رو میگیم crontab. توی مقالات بعدی راجب اینکه چرا باید زبان شناسی و فلسفه پشت عبارات رو مفهومی درک کنیم مینویسم.

آموزش زمان‌بندی با ShellScript و cronjob

مرحله 0 Terminal

بیاید با هم از صفر شروع کنیم. فرقی نمیکنه با سرور کار میکنید یا سیستم شخصی خودتون، برای شروع وارد محیط Terminal میشیم. به عنوان مثال من اینجا از طریق SSH با PowerShell به سرور لینوکسی خودم وصل شدم.

دادن محیط ترمینال

مرحله 1 نصب cron

با دستور sudo systemctl status cron نصب cron رو بررسی میکنیم. در صورتی که cron نصب باشه پیامی مشابه زیر میبینیم. که بهمون میگه cron نصب و در حال اجراست.

بررسی نصب بودن cron با دستور sudo systemctl status cron

اگر cron نصب نبود، برای اینکه سیستم تشخیص بده آخرین نسخه ای که باید نصب کنه چیه دستور sudo apt update رو اجرا میکنیم. بعد از اون دستور sudo apt install cron -y رو اجرا میکنیم. این دستور cron رو نصب میکنه و فِلَگ -y اینجا تایید میکنه که سیستم فضای نصب مورد نیاز برای نصب رو اختصاص بده. به طور کلی کار این فلگ تایید کردن سوال های سیستم هست.

بعد از اون دستور sudo systemctl enable --now cron رو اجرا میکنیم. این دستور cron رو بلافاصله بعد از روشن شدن سیستم اجرا میکنه تا نیاز نباشه هر بار دستی این کارو انجام بدید.

در آخر برای تایید نصب sudo systemctl status cron رو اجرا کنید تا پیام بالا رو ببینید.

مرحله 2 ساخت اسکریپت بکاپ

با دستور sudo mkdir -p /tosinso/backups میخوام یه فولدر به اسم tosinso بسازم تا توش اسکریپتی که مینویسیم رو ذخیره کنم، داخلش یه فولدر به اسم backups میسازم تا بکاپ هایی که میگیرم رو ذخیره کنم.

برای دسترسی ادمین sudo استفاده میکنیم و فلگ -p کاری میکنه تا تمام فولدر های والدی که توی مسیری که مشخص کردیم نیستن ساخته بشن. مثلا با دستوری که بالا نوشتیم هم فولدر tosinso هم فولدر backups داخلش ایجاد شدن.

بعد با دستور cd /tosinso وارد فولدری که ساختم میشم و با دستور ls محتواش رو میبینم، فولدری که ساختیم داخلش هست.

ایجاد فولدرهای تست برای آموزشفرض میکنم میخوام هر روز از test1 و test2/sample بکاپ بگیرم. برای این آموزش به کمک دستور mkdir که گفتم داخل فولدر tosinso ایجادشون میکنم و به کمک ls از ساخته شدنشون مطمئن میشم.

ایجاد ساب فولدرها مورد نیاز برای آموزشبا دستور nano یه فایل با پسوند sh ایجاد میکنیم تا اسکریپتمون رو توش بنویسیم. به فایل هایی که پسوند sh دارن میگن shell script ، به طور خیلی کلی فایلی که توش یه لیست از دستورات لینوکس رو میزاریم تا به ترتیب اجراشون کنه. وقتی دستور sudo nano auto_backup.sh رو زدید وارد محیط زیر میشید.

ایجاد فایل اسکریپت در محیط nanoکد زیر رو بزارید داخل این فایل، با زدن CTRL + X، بعد Y و Enter فایل ذخیره میشه و به محیط Terminal بر میگردید.

#!/bin/bash
# === C
BACKUP_SRC=("/tosinso/test1" "/tosinso/test2/sample")
BACKUP_DEST="/tosinso/backups"
DATE=$(date +'%Y-%m-%d_%H-%M')
HOST=$(hostname)
BACKUP_NAME="${HOST}_backup_${DATE}.tar.gz"
LOGFILE="/tosinso/log/auto_backup.log"

# === BACKUP ===
echo "[$(date)] Starting backup..." >> "$LOGFILE"

tar -czf "${BACKUP_DEST}/${BACKUP_NAME}" "${BACKUP_SRC[@]}" >> "$LOGFILE" 2>&1

if [ $? -eq 0 ]; then
    echo "[$(date)] Backup successful: ${BACKUP_NAME}" >> "$LOGFILE"
else
    echo "[$(date)] Backup FAILED!" >> "$LOGFILE"
fi

# === CLEANUP OLD BACKUPS (older than 7 days) ===
find "$BACKUP_DEST" -type f -name "*.tar.gz" -mtime +7 -exec rm {} \; >> "$LOGFILE" 2>&1

مرحله 4 زمان‌بندی با cronjob

با دستور crontab -e لیست cronjob هاتون رو باز کنید، برای بار اول ازتون میخواد که ادیتور انتخاب کنید که پیشنهاد من همون nano هست. کد زیر رو به آخر فایل اضافه کنید. زمان‌بندی cron و آدرس اسکریپتی که میخواید براتون اجرا کنه.

0 2 * * *  /tosinso/auto_backup.sh
│ │ │ │ │
│ │ │ │ └── روز هفته (0-7) → 0=Sunday
│ │ │ └──── ماه (1-12) (* یعنی هر ماه)
│ │ └────── روز از ماه (1-31) (* یعنی هر روز)
│ └──────── ساعت (0-23) (2 یعنی 2 بعد از نیمه شب)
└────────── دقیقه (0-59) (0 یعنی شروع ساعت)

اضافه کردن اسکریپت به crontabبعد از ذخیره فایل و خروج از nano پبام crontab: installing new crontab رو داخل ترمینال میبینید، که به معنیه اینه که cronjob شما فعال شده.

بررسی اضافه شدن موفق cron اگر دستور crontab -l رو بزنید میتونید مطمئن بشید که cronjob اضافه شده.

مرحله 5 تست و بررسی

برای تست اسکریپت کافیه یدور با bash اجراش کنید و بررسی کنید که چه لاگی گرفتید و مطمئن شید بکاپ ایجاد شده.

sudo bash auto_backup.sh

اجرای اسکریپت و بررسی ایجاد شدن بکاپبررسی فایل لاگی که ایجاد کردیم به کمک nano:

بررسی فایل لاگ اسکریپت

اشتباهات رایج و نکات تجربی

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

توی این دوره خیلیا از هوش مصنوعی کد هاشون رو میگیرن و این اشکالی نداره، ولی همونطور که اول این مطلب اشاره کردم، سعی کنید کد رو درک کنید، حتی دلیل نامگذاری دستورات، درست مثل cronjob که الآن درکش کردید.

نتیجه گیری

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

ساخت فولدر
sudo mkdir -p /folderName/anotherFolderName

ساخت یا ویرایش فایل
sudo nano /path/filename.fileExtension

تست دستی
sudo bash /path/filename.fileExtension

زمان‌بندی با cronjob
sudo crontab -e
0 2 * * * command_or_script_for_cron_to_run

چک کردن cronjob ها
sudo crontab -l

لاگ cronjob های سیستم
grep CRON /var/log/syslog