كتابة سكربتات أتمتة لمهام النسخ الاحتياطي والصيانة
أهلاً يا شباب! بصفتي مهندس أنظمة لينكس، بعرف قد إيش الأتمتة بتوفر علينا وقت وجهد. اليوم رح نحكي عن سكربتات بسيطة بس قوية لمهام النسخ الاحتياطي والصيانة اللي لازم تكون جزء من روتين كل سيرفر.
1. سكربتات النسخ الاحتياطي (Backups)
النسخ الاحتياطي هو أهم شي. لو ضاع الداتا، راحت عليك. خلينا نشوف كيف نعمل سكربتات بسيطة وفعالة.
أ. نسخ احتياطي للملفات والمجلدات باستخدام tar و rsync
أسهل طريقة لنسخ مجلد كامل هي بـ tar، وممكن نضغطه كمان. أما rsync فهو ممتاز للنسخ التزايدي (incremental) عشان ما ينسخ إلا الملفات اللي تغيرت.
ملاحظة: دائماً فكر وين رح تخزن النسخة الاحتياطية. يفضل تكون على سيرفر تاني، جهاز تخزين شبكي (NAS)، أو حتى سحابة (cloud storage).
مثال على سكربت tar لضغط مجلد:
هذا السكربت بياخد نسخة من مجلد معين، بيضغطها، وبيسميها بتاريخ اليوم.
#!/bin/bash
# المتغيرات
SOURCE_DIR="/var/www/html"
BACKUP_DIR="/mnt/backups/web_data"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
BACKUP_FILENAME="web_data_backup_${DATE}.tar.gz"
# إنشاء مجلد النسخ الاحتياطي إذا لم يكن موجوداً
mkdir -p "${BACKUP_DIR}"
# إنشاء النسخة الاحتياطية باستخدام tar
echo "بدء عملية النسخ الاحتياطي للملفات من ${SOURCE_DIR}..."
tar -czf "${BACKUP_DIR}/${BACKUP_FILENAME}" "${SOURCE_DIR}"
if [ $? -eq 0 ]; then
echo "تم النسخ الاحتياطي بنجاح إلى ${BACKUP_DIR}/${BACKUP_FILENAME}"
else
echo "فشل النسخ الاحتياطي!"
fi
# تنظيف النسخ القديمة (احتفظ بآخر 7 أيام)
echo "تنظيف النسخ الاحتياطية القديمة..."
find "${BACKUP_DIR}" -type f -name "*.tar.gz" -mtime +7 -delete
echo "اكتمل التنظيف."
مثال على سكربت rsync للنسخ التزايدي:
الـ rsync عظيم لنسخ الملفات بين سيرفرات، أو حتى داخل نفس السيرفر بكفاءة.
#!/bin/bash
# المتغيرات
SOURCE_DIR="/home/user/documents/"
DEST_DIR="/mnt/backups/home_docs/"
LOG_FILE="/var/log/rsync_home_docs.log"
# إنشاء مجلد الوجهة إذا لم يكن موجوداً
mkdir -p "${DEST_DIR}"
# بدء عملية النسخ الاحتياطي باستخدام rsync
echo "$(date): بدء عملية النسخ الاحتياطي لـ ${SOURCE_DIR} إلى ${DEST_DIR}" >> "${LOG_FILE}"
rsync -avz --delete "${SOURCE_DIR}" "${DEST_DIR}" >> "${LOG_FILE}" 2>&1
if [ $? -eq 0 ]; then
echo "$(date): تم النسخ الاحتياطي بنجاح." >> "${LOG_FILE}"
else
echo "$(date): فشل النسخ الاحتياطي!" >> "${LOG_FILE}"
fi
ب. نسخ احتياطي لقواعد البيانات (Databases)
قواعد البيانات تحتاج معاملة خاصة. mysqldump للـ MySQL و pg_dump للـ PostgreSQL هم أصدقائك هنا.
مثال على سكربت mysqldump (MySQL/MariaDB):
#!/bin/bash
# المتغيرات
DB_USER="backup_user"
DB_PASS="your_db_password" # يفضل استخدام ملف .my.cnf
DB_NAME="your_database_name"
BACKUP_DIR="/mnt/backups/mysql"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
BACKUP_FILENAME="${DB_NAME}_backup_${DATE}.sql.gz"
# إنشاء مجلد النسخ الاحتياطي
mkdir -p "${BACKUP_DIR}"
# إنشاء النسخة الاحتياطية لقاعدة البيانات
echo "بدء عملية النسخ الاحتياطي لقاعدة البيانات ${DB_NAME}..."
mysqldump -u"${DB_USER}" -p"${DB_PASS}" "${DB_NAME}" | gzip > "${BACKUP_DIR}/${BACKUP_FILENAME}"
if [ $? -eq 0 ]; then
echo "تم النسخ الاحتياطي لقاعدة البيانات بنجاح إلى ${BACKUP_DIR}/${BACKUP_FILENAME}"
else
echo "فشل النسخ الاحتياطي لقاعدة البيانات!"
fi
# تنظيف النسخ القديمة (احتفظ بآخر 7 أيام)
echo "تنظيف النسخ الاحتياطية القديمة..."
find "${BACKUP_DIR}" -type f -name "*.sql.gz" -mtime +7 -delete
echo "اكتمل التنظيف."
نصيحة أمنية: لا تضع كلمة المرور مباشرة في السكربت. استخدم ملف
~/.my.cnfمع الصلاحيات المناسبة (chmod 600 ~/.my.cnf) لتخزين بيانات الاعتماد بأمان.
2. سكربتات الصيانة (Maintenance)
الصيانة الدورية بتخلي السيرفر شغال زي الفل وبتقلل المشاكل.
أ. تنظيف سجلات النظام (Log Cleanup)
ملفات السجلات (logs) ممكن تكبر بسرعة وتستهلك مساحة القرص. logrotate هو الأداة الأفضل، بس ممكن نعمل سكربت بسيط كمان.
مثال على سكربت بسيط لتنظيف السجلات:
#!/bin/bash
# المتغيرات
LOG_DIR="/var/log"
DAYS_TO_KEEP=30
LOG_FILES=(
"${LOG_DIR}/nginx/*.log"
"${LOG_DIR}/apache2/*.log"
"${LOG_DIR}/syslog"
"${LOG_DIR}/auth.log"
)
echo "بدء تنظيف السجلات القديمة في ${LOG_DIR}..."
for log_file in "${LOG_FILES[@]}"; do
# حذف الملفات الأقدم من DAYS_TO_KEEP
find $(dirname "${log_file}") -type f -name "$(basename "${log_file}")*" -mtime +${DAYS_TO_KEEP} -delete
done
echo "اكتمل تنظيف السجلات."
ملاحظة: الأداة القياسية لتنظيف السجلات هي
logrotate، وهي أكثر مرونة وقوة. هذا السكربت مثال بسيط فقط.
ب. مراقبة مساحة القرص (Disk Space Monitoring)
مراقبة مساحة القرص مهمة عشان ما يتعبى فجأة ويوقف السيرفر.
مثال على سكربت لمراقبة مساحة القرص وإرسال إيميل:
#!/bin/bash
# المتغيرات
THRESHOLD=90 # النسبة المئوية للمساحة المستخدمة التي عندها يتم التنبيه
ALERT_EMAIL="your_email@example.com"
HOSTNAME=$(hostname)
# الحصول على استخدام القرص
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//g')
if [ "${DISK_USAGE}" -ge "${THRESHOLD}" ]; then
echo "تنبيه: مساحة القرص على ${HOSTNAME} تجاوزت ${THRESHOLD}%! الاستخدام الحالي: ${DISK_USAGE}%" | mail -s "تنبيه: مساحة قرص عالية على ${HOSTNAME}" "${ALERT_EMAIL}"
echo "تم إرسال تنبيه بالبريد الإلكتروني."
else
echo "مساحة القرص طبيعية على ${HOSTNAME}. الاستخدام الحالي: ${DISK_USAGE}%"
fi
تنبيه: تأكد من تثبيت حزمة
mailutilsأو ما يعادلها (مثلsendmailأوpostfix) على نظامك لكي يعمل أمر
ج. تحديثات النظام (System Updates)
تحديث النظام بانتظام ضروري للأمان والاستقرار.
مثال على سكربت لتحديث نظام Debian/Ubuntu:
#!/bin/bash
# المتغيرات
LOG_FILE="/var/log/system_update.log"
echo "بدء تحديث النظام على $(hostname) في $(date)..." | tee -a "${LOG_FILE}"
# تحديث قائمة الحزم
apt update -y | tee -a "${LOG_FILE}"
# ترقية الحزم المثبتة
apt upgrade -y | tee -a "${LOG_FILE}"
# إزالة الحزم غير الضرورية
apt autoremove -y | tee -a "${LOG_FILE}"
echo "اكتمل تحديث النظام على $(hostname) في $(date)." | tee -a "${LOG_FILE}"
تحذير: تشغيل التحديثات تلقائياً ممكن يسبب مشاكل أحياناً، خصوصاً في بيئات الإنتاج الحرجة. يفضل مراجعة التحديثات يدوياً أو استخدام أدوات مثل
unattended-upgradesمع ضبط دقيق.
3. جدولة السكربتات باستخدام cron
بعد ما كتبنا السكربتات، لازم نخليها تشتغل لحالها. cron هو الأداة اللي بتعمل هيك.
خطوات جدولة سكربت:
اجعل السكربت قابلاً للتنفيذ:
chmod +x /path/to/your_script.shافتح جدول
cronللمستخدم الحالي:crontab -eأضف السطر الخاص بالجدولة:
مثلاً، لتشغيل سكربت النسخ الاحتياطي كل يوم الساعة 3 صباحاً:
0 3 * * * /path/to/your_backup_script.sh >> /var/log/backup_cron.log 2>&1الـ
>> /var/log/backup_cron.log 2>&1بيضمن إنه أي إخراج أو أخطاء للسكربت رح تتسجل بملف، وهذا مهم جداً للمتابعة.
صيغة
cron:
* * * * * command_to_execute
| | | | |
| | | | ----- يوم الأسبوع (0-7, 0 و 7 هي الأحد)
| | | ------- الشهر (1-12)
| | --------- يوم الشهر (1-31)
| ----------- الساعة (0-23)
------------- الدقيقة (0-59)
خاتمة
الأتمتة هي عمود أساسي في إدارة أنظمة لينكس. السكربتات اللي شفناها اليوم هي مجرد بداية. بتقدر تطورها وتضيف عليها ميزات مثل إرسال التقارير، التكامل مع أنظمة المراقبة، وغيره. بس الأهم إنك تبدأ وتخلي سيرفراتك آمنة ومستقرة.
بالتوفيق!