0Pricing
Linux Command Line & Bash Scripting Mastery · درس

مشروع Scripting متقدم

أنجزوا مشروعًا شاملًا يدمج جميع المفاهيم التي تعلّمتموها، من أدوات سطر الأوامر إلى تقنيات Bash scripting المتقدمة.

مشروع Scripting متقدم درس مجاني في Linux Command Line & Bash Scripting Mastery على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Linux Command Line & Bash Scripting Mastery، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Linux Command Line & Bash Scripting Mastery 4 دروس في المجموع.

بداية المشروع: التحدي

مرحبًا بك في مشروعنا النهائي! خلال هذه الدورة، تعلمت العديد من أوامر Linux القوية وتقنيات كتابة برامج Bash النصية. والآن حان الوقت لجمعها كلها معًا.

في هذا الدرس، سنبني برنامج Bash نصيًا عمليًا ومتقدمًا من الصفر. سيتحداك هذا المشروع في دمج كل ما تعلمته في حل واحد وظيفي.

تحديد هدف مشروعنا

هدفنا هو إنشاء برنامج نصي لمراقبة الملفات وأرشفتها. تخيل أن لديك خادمًا ينشئ ملفات سجلات، وأنك تحتاج إلى معالجتها بانتظام من دون تدخل يدوي.

إليك ما سيفعله برنامجنا النصي:

  • مراقبة دليل محدد باستمرار بحثًا عن ملفات نصية جديدة.
  • معالجة كل ملف جديد (مثل عدّ أسطره).
  • نقل الملف المُعالَج إلى دليل أرشيف.
  • تسجيل جميع الأنشطة، بما في ذلك الطوابع الزمنية وأي أخطاء.

أساس البرنامج النصي: Shebang والمتغيرات

يبدأ كل برنامج نصي جيد بأساس واضح. سنبدأ بتعريف shebang وإعداد المتغيرات الأساسية. ستجعل هذه المتغيرات برنامجنا النصي مرنًا وسهل الإعداد.

سنعرّف مسارات دليل المراقبة ودليل الأرشيف وملف السجل.

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

التأكد من وجود الأدلة

قبل أن يتمكن برنامجنا النصي من المراقبة أو الأرشفة، نحتاج إلى التأكد من وجود الأدلة المطلوبة. ويُعد استخدام mkdir -p أمرًا بالغ الأهمية هنا، إذ ينشئ الأدلة فقط إذا لم تكن موجودة مسبقًا، ولا يُصدر خطأً إذا كانت موجودة.

سنضيف أيضًا معالجة أساسية للأخطاء للخروج بسلاسة إذا فشل إنشاء الدليل.

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

حلقة المراقبة

يحتاج برنامجنا النصي إلى العمل باستمرار لمراقبة الملفات الجديدة. وتُعد حلقة while true مناسبة تمامًا لهذا الغرض. داخل الحلقة، سنستخدم sleep للتوقف بضع ثوانٍ بين عمليات الفحص، مما يمنعها من استهلاك موارد كثيرة.

سنُسجّل أيضًا كل عملية فحص لتتبّع النشاط.

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

# --- Main Monitoring Loop ---
while true; do
  echo "$(date): Checking for new files in $MONITOR_DIR..." >> "$LOG_FILE"
  # File processing will go here
  sleep 5 # Check every 5 seconds
done

العثور على الملفات ومعالجتها

داخل حلقتنا، نحتاج إلى العثور على ملفات نصية جديدة. يُعد الأمر find مناسبًا جدًا لذلك، مع دمجه مع حلقة for لمعالجة كل ملف يتم العثور عليه. سنستخدم wc -l لعدّ الأسطر في كل ملف باعتبار ذلك خطوة المعالجة.

يوضح هذا كيفية دمج أدوات سطر الأوامر داخل برنامج نصي.

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

# --- Main Monitoring Loop ---
while true; do
  echo "$(date): Checking for new files in $MONITOR_DIR..." >> "$LOG_FILE"
  # Find new .txt files and process them
  for file in $(find "$MONITOR_DIR" -maxdepth 1 -type f -name "*.txt"); do
    if [ -f "$file" ]; then # Double-check if it's a regular file
      LINE_COUNT=$(wc -l < "$file")
      echo "$(date): Found '$file'. Lines: $LINE_COUNT." >> "$LOG_FILE"
      # Archiving will go here
    fi
  done
  sleep 5 # Check every 5 seconds
done

أرشفة الملفات المعالَجة

بعد معالجة ملف، نحتاج إلى نقله إلى مجلد الأرشيف. يُستخدم الأمر mv لهذا الغرض. سنضيف أيضًا عبارة if للتحقق من حالة خروج mv، والتأكد من نجاح النقل وتسجيل أي حالات فشل.

يضيف هذا مزيدًا من المتانة إلى برنامجنا النصي.

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

# --- Main Monitoring Loop ---
while true; do
  echo "$(date): Checking for new files in $MONITOR_DIR..." >> "$LOG_FILE"
  for file in $(find "$MONITOR_DIR" -maxdepth 1 -type f -name "*.txt"); do
    if [ -f "$file" ]; then
      LINE_COUNT=$(wc -l < "$file")
      echo "$(date): Found '$file'. Lines: $LINE_COUNT." >> "$LOG_FILE"
      
      mv "$file" "$ARCHIVE_DIR/"
      if [ $? -eq 0 ]; then
        echo "$(date): Moved '$file' to '$ARCHIVE_DIR'." >> "$LOG_FILE"
      else
        echo "$(date): ERROR: Failed to move '$file' to '$ARCHIVE_DIR'." >> "$LOG_FILE"
      fi
    fi
  done
  sleep 5
done

إضافة خروج سلس باستخدام Trap

يحتاج البرنامج النصي طويل التشغيل إلى طريقة للتوقف بسلاسة. يتيح لنا الأمر trap التقاط الإشارات، مثل SIGINT (التي يتم تشغيلها بالضغط على Ctrl+C)، وتنفيذ دالة تنظيف قبل الخروج. يضمن ذلك تسجيل البرنامج النصي لعملية إيقافه.

هذه خطوة بالغة الأهمية للبرامج النصية الجاهزة للاستخدام في بيئة الإنتاج.

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# --- Functions ---
cleanup() {
  echo "$(date): Script received stop signal. Exiting gracefully." >> "$LOG_FILE"
  exit 0 # Exit with success status
}

# --- Trap Signals ---
# Trap SIGINT (Ctrl+C) and call the cleanup function
trap cleanup SIGINT

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

# --- Main Monitoring Loop ---
while true; do
  echo "$(date): Checking for new files in $MONITOR_DIR..." >> "$LOG_FILE"
  for file in $(find "$MONITOR_DIR" -maxdepth 1 -type f -name "*.txt"); do
    if [ -f "$file" ]; then
      LINE_COUNT=$(wc -l < "$file")
      echo "$(date): Found '$file'. Lines: $LINE_COUNT." >> "$LOG_FILE"
      
      mv "$file" "$ARCHIVE_DIR/"
      if [ $? -eq 0 ]; then
        echo "$(date): Moved '$file' to '$ARCHIVE_DIR'." >> "$LOG_FILE"
      else
        echo "$(date): ERROR: Failed to move '$file' to '$ARCHIVE_DIR'." >> "$LOG_FILE"
      fi
    fi
  done
  sleep 5
done

اختبار البرنامج النصي المتقدم

بعد اكتمال برنامجنا النصي، حان وقت اختباره! عادةً ما ستشغّله في الخلفية (مثلًا، ./monitor.sh &)، ثم تنشئ ملفات اختبار في $MONITOR_DIR وتراقب $LOG_FILE و$ARCHIVE_DIR.

إليك برنامجًا نصيًا صغيرًا يمكنك تشغيله لإنشاء ملف اختبار بسهولة لبرنامج المراقبة.

#!/bin/bash
# create_test_file.sh

MONITOR_DIR="/tmp/coddykit_monitor"
mkdir -p "$MONITOR_DIR" # Ensure dir exists for this test script

# Create a unique test file
TEST_FILE="$MONITOR_DIR/test_log_$(date +%Y%m%d_%H%M%S).txt"
echo "This is a test entry." > "$TEST_FILE"
echo "Another line for testing." >> "$TEST_FILE"
echo "Created new test file: $TEST_FILE"

مراجعة منطق البرنامج النصي

يجمع برنامجنا النصي المتقدم بين العديد من المفاهيم. لنراجع سريعًا بعض الأوامر والبنى الأساسية التي استخدمناها.

فكّر في الدور الذي يؤديه كل أمر لتحقيق هدف مشروعنا.

ما بعد ذلك: الجدولة والتخصيص

صُمّم هذا البرنامج النصي للعمل بشكل مستمر. في سيناريو واقعي، قد تشغّله في الخلفية باستخدام nohup ./script.sh & أو، بصورة أكثر شيوعًا، تجدوله ليعمل دوريًا باستخدام Cron.

تذكّر أن Cron مناسب جدًا لأتمتة مهام كهذه. يمكنك جدولته ليعمل كل بضع دقائق، ويتحقق من المجلد ويعالج الملفات حسب الحاجة.

فكّر في تخصيصه من أجل:

  • معالجة أنواع مختلفة من الملفات.
  • تنفيذ إجراءات مختلفة (مثل ضغط الملفات أو رفعها إلى السحابة).
  • إضافة تقارير أخطاء أكثر تقدمًا (مثل التنبيهات عبر البريد الإلكتروني).

مراجعة المشروع والخطوات التالية

تهانينا! لقد أكملت للتو مشروعًا متقدمًا للبرمجة النصية باستخدام Bash، ودمجت مجموعة واسعة من أوامر Linux وتقنيات البرمجة النصية.

لقد تعلمت ما يلي:

  • هيكلة برنامج نصي متين وطويل التشغيل.
  • استخدام المتغيرات لإعداد البرنامج.
  • تنفيذ حلقات للمراقبة المستمرة.
  • دمج أوامر مثل find وwc وmv.
  • إضافة معالجة للأخطاء وخروج سلس باستخدام trap.

يمثل هذا المشروع أساسًا متينًا لبناء حلول أتمتة أكثر تعقيدًا. واصل التجربة والبناء!

الأسئلة الشائعة

هل درس «مشروع Scripting متقدم» مجاني؟

نعم — نص درس «مشروع Scripting متقدم» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Linux Command Line & Bash Scripting Mastery، انتقل إلى CoddyKit PRO. تتضمن دورة Linux Command Line & Bash Scripting Mastery 4 دروس في المجموع.

ماذا ستتعلم في «مشروع Scripting متقدم»؟

أنجزوا مشروعًا شاملًا يدمج جميع المفاهيم التي تعلّمتموها، من أدوات سطر الأوامر إلى تقنيات Bash scripting المتقدمة. تتمرن على Linux Command Line & Bash Scripting Mastery مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Linux Command Line & Bash Scripting Mastery؟

لا تُشترط خبرة سابقة. Linux Command Line & Bash Scripting Mastery على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «مشروع Scripting متقدم»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Linux Command Line & Bash Scripting Mastery هذا؟

نعم. كل درس في Linux Command Line & Bash Scripting Mastery يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. جدولة المهام باستخدام Cron
  2. أتمتة إدارة النظام
  3. مشروع Scripting متقدم
  4. التدوير والتنظيف الآليان للسجلات
← العودة إلى Linux Command Line & Bash Scripting Mastery