در این مطلب به اهمیت بکاپ گیری منظم از اطلاعات و ساده سازی و خودکار کردن این فرایند و آموزش زمانبندی با 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 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 رو زدید وارد محیط زیر میشید.
کد زیر رو بزارید داخل این فایل، با زدن 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 یعنی شروع ساعت)
بعد از ذخیره فایل و خروج از nano پبام
crontab: installing new crontab رو داخل ترمینال میبینید، که به معنیه اینه که cronjob شما فعال شده.
اگر دستور
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
نظرات کاربران (0)