آموزش ساخت اسکریپت خودکار برای بکاپ در لینوکس

در این مطلب به اهمیت بکاپ گیری منظم از اطلاعات و ساده سازی و خودکار کردن این فرایند و آموزش زمانبندی با 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-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
اشتباهات رایج و نکات تجربی
خیلی پیش میاد که کد های شما مثل زمانی که داشتم این مقاله رو مینوشتم ممکنه اجرا نشه، حتما مسیر هایی که داخل کد میزارید، سینتکس یا همون قواعد نگارش کد، و سطح دسترسی که به فایل یا فولدری میدید رو بررسی کنید.
توی این دوره خیلیا از هوش مصنوعی کد هاشون رو میگیرن و این اشکالی نداره، ولی همونطور که اول این مطلب اشاره کردم، سعی کنید کد رو درک کنید، حتی دلیل نامگذاری دستورات، درست مثل 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
سوالات متداول
cronjob در لینوکس دقیقاً چیه؟
cronjob یه سیستم زمانبندی در لینوکسه که بهت اجازه میده اجرای خودکار دستورها یا اسکریپتها رو در زمان مشخص برنامهریزی کنی. مثلاً میتونی هر شب ساعت ۲ صبح از فایلهات بکاپ بگیری بدون اینکه دستی کاری کنی.
چطور cron رو روی لینوکس نصب و فعال کنم؟
با دستور sudo apt install cron -y میتونی cron رو نصب کنی. بعد با sudo systemctl enable –now cron مطمئن شو که سرویسش فعاله و با روشن شدن سیستم خودش اجرا میشه
چطور یه اسکریپت بکاپ خودکار بسازم؟
کافیه یه فایل با پسوند .sh بسازی (مثلاً auto_backup.sh) و داخلش دستورهای بکاپ، مسیر منبع و مقصد رو بنویسی. بعد با bash تستش کن و نهایتاً با crontab -e زمان اجرای خودکارش رو تنظیم کن.
چطور بفهمم cronjobهام درست کار میکنن؟
با دستور sudo crontab -l میتونی لیست cronjobهات رو ببینی و با grep CRON /var/log/syslog وضعیت اجراشون رو بررسی کنی. اگه لاگ تنظیم کرده باشی، خروجی هر بکاپ هم اونجا ذخیره میشه.
چطور بکاپهای قدیمی رو بهصورت خودکار پاک کنم؟
میتونی از دستور find استفاده کنی. مثلاً: find /tosinso/backups -type f -name “*.tar.gz” -mtime +7 -exec rm {} \; این دستور تمام بکاپهایی که بیشتر از ۷ روز عمر دارن رو حذف میکنه.
اگه cronjob اجرا نشه یا لاگی تولید نکنه، از کجا بفهمم مشکل از کجاست؟
اول با دستور sudo systemctl status cron مطمئن شو سرویس cron فعاله. بعد sudo crontab -l رو بزن تا ببینی cronjob واقعاً ثبت شده. اگه همچنان لاگی ندیدی، مسیر LOGFILE رو چک کن یا لاگ سیستم رو با دستور زیر بررسی کن: grep CRON /var/log/syslog در نهایت اگه فایل با Bash درست اجرا میشه ولی cron نه، احتمالاً مسیرهای نسبی یا مجوز دسترسی (permissions) باعث خطا شدن.
اگه بخوام بکاپهامو توی سرور دیگه یا فضای ابری (مثل Google Drive یا FTP) ذخیره کنم، باید چی رو توی اسکریپت تغییر بدم؟
کافیه مسیر متغیر BACKUP_DEST رو به مقصد دلخواه تغییر بدی. مثلاً برای انتقال به سرور دیگه میتونی بعد از ساخت فایل بکاپ از دستور scp یا rsync استفاده کنی: rsync -avz /tosinso/backups/*.tar.gz user@remote-server:/path/to/remote/folder اگه بخوای به Google Drive یا فضای ابری بفرستی، ابزارهایی مثل rclone گزینههای بهتری هستن چون میتونن مستقیم به حساب ابری وصل شن.

