انتقل إلى المحتوى الرئيسي

الفصل 6.4 - الدوال و Cron

الأهداف التعليمية​

في نهاية هذا الفصل، ستكون قادرًا على:

  • إنشاء واستخدام دوال Bash
  • فهم معلمات الدوال
  • جدولة المهام باستخدام cron
  • استخدام crontab
  • فهم صياغة cron

دوال Bash​

التعريف​

#!/bin/bash
# الصياغة 1
nom_fonction() {
commandes
}

# الصياغة 2
function nom_fonction {
commandes
}

# الصياغة 3 (قابلة للنقل)
function nom_fonction() {
commandes
}

مثال بسيط​

#!/bin/bash
# دالة بسيطة
bonjour() {
echo "Bonjour $1!"
}

# استدعاء
bonjour "Linux"
bonjour "Monde"

المعلمات​

#!/bin/bash
# المعلمات: $1, $2, إلخ. (محلية للدالة)
ma_fonction() {
echo "الأول: $1"
echo "الثاني: $2"
echo "الكل: $@"
echo "العدد: $#"
}

# استدعاء
ma_fonction "arg1" "arg2" "arg3"

قيمة الإرجاع​

#!/bin/bash
# كود الإرجاع (0-255)
est_fichier() {
if [ -f "$1" ]; then
return 0 # نجاح
else
return 1 # فشل
fi
}

# استخدام
if est_fichier "/etc/passwd"; then
echo "الملف موجود"
fi

المتغيرات المحلية​

#!/bin/bash
# متغير محلي (نطاق الدالة)
ma_fonction() {
local var_locale="valeur"
echo "محلي: $var_locale"
}

# متغير عالمي
var_globale="globale"

ma_fonction
echo "عالمي: $var_globale"

أمثلة على الدوال​

دالة مساعدة​

#!/bin/bash
# تسجيل مع timestamp
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
}

# استخدام
log "بداية السكربت"
log "خطأ: الملف غير موجود"
log "نهاية السكربت"

دالة تحقق​

#!/bin/bash
# التحقق مما إذا كان المستخدم موجودًا
utilisateur_existe() {
id "$1" &>/dev/null
return $?
}

# استخدام
if utilisateur_existe "user1"; then
echo "المستخدم موجود"
else
echo "المستخدم غير موجود"
fi

دالة مع إرجاع قيمة​

#!/bin/bash
# إرجاع قيمة (عبر echo)
calculer() {
local resultat=$(( $1 + $2 ))
echo "$resultat"
}

# استخدام
somme=$(calculer 5 3)
echo "المجموع: $somme"

Cron - جدولة المهام​

ما هو Cron؟​

Cron هو خادم يقوم بتنفيذ المهام في أوقات مجدولة.


صياغة Cron​

التنسيق​

┌───────────── الدقيقة (0 - 59)
│ ┌───────────── الساعة (0 - 23)
│ │ ┌───────────── يوم الشهر (1 - 31)
│ │ │ ┌───────────── الشهر (1 - 12)
│ │ │ │ ┌───────────── يوم الأسبوع (0 - 7) (0 أو 7 = الأحد)
│ │ │ │ │
* * * * * الأمر

أمثلة​

الجدولالوصف
0 2 * * *كل يوم في الساعة 2:00
*/5 * * * *كل 5 دقائق
0 */2 * * *كل ساعتين
0 0 * * 0كل يوم أحد في منتصف الليل
0 0 1 * *الأول من كل شهر
0 9-17 * * 1-5من 9 صباحًا إلى 5 مساءً، الاثنين-الجمعة
0 0,12 * * *منتصف الليل والظهر كل يوم
*/30 * * * *كل 30 دقيقة

متغيرات البيئة​

# في crontab
PATH=/usr/bin:/bin
SHELL=/bin/bash
MAILTO=admin@example.com
HOME=/home/user

# ثم المهام
0 2 * * * /chemin/vers/script.sh

استخدام crontab​

تحرير Crontab​

# تحرير crontab المستخدم
crontab -e

# عرض crontab الحالي
crontab -l

# حذف crontab
crontab -r

# تحرير crontab لمستخدم (root)
sudo crontab -u user1 -e

تنسيق Crontab​

# تعليق
# دقيقة ساعة يوم شهر يوم_الأسبوع الأمر

# مثال
0 2 * * * /usr/local/bin/backup.sh
*/15 * * * * /usr/local/bin/check.sh
0 0 1 * * /usr/local/bin/monthly-report.sh

إعادة التوجيه​

# إعادة توجيه المخرجات
0 2 * * * /script.sh > /var/log/script.log 2>&1

# تجاهل المخرجات
0 2 * * * /script.sh > /dev/null 2>&1

# إرسال عبر البريد الإلكتروني (إذا تم تعريف MAILTO)
0 2 * * * /script.sh

أدلة Cron​

/etc/cron.d/​

للمهام النظامية:

# إنشاء ملف في /etc/cron.d/
sudo nano /etc/cron.d/mon-tache

# التنسيق (مع المستخدم)
0 2 * * * user1 /usr/local/bin/script.sh

أدلة خاصة​

/etc/cron.hourly/   # يتم تنفيذه كل ساعة
/etc/cron.daily/ # يتم تنفيذه كل يوم
/etc/cron.weekly/ # يتم تنفيذه كل أسبوع
/etc/cron.monthly/ # يتم تنفيذه كل شهر

ضع السكربتات في هذه الأدلة (قابلة للتنفيذ، بدون امتداد .sh)


أمثلة عملية​

النسخ الاحتياطي اليومي​

#!/bin/bash
# /usr/local/bin/backup-daily.sh
BACKUP_DIR="/backup"
SOURCE_DIR="/data"
DATE=$(date +%Y%m%d)

tar -czf "$BACKUP_DIR/backup-$DATE.tar.gz" "$SOURCE_DIR"
find "$BACKUP_DIR" -name "backup-*.tar.gz" -mtime +7 -delete

Crontab:

0 2 * * * /usr/local/bin/backup-daily.sh

تنظيف السجلات​

#!/bin/bash
# /usr/local/bin/cleanup-logs.sh
find /var/log -name "*.log" -mtime +30 -delete
find /var/log -name "*.gz" -mtime +90 -delete

Crontab:

0 3 * * 0 /usr/local/bin/cleanup-logs.sh

المراقبة​

#!/bin/bash
# /usr/local/bin/check-disk.sh
THRESHOLD=80
USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')

if [ "$USAGE" -gt "$THRESHOLD" ]; then
echo "تنبيه: القرص عند ${USAGE}%" | mail -s "تنبيه القرص" admin@example.com
fi

Crontab:

*/15 * * * * /usr/local/bin/check-disk.sh

أفضل الممارسات​

سكربتات Cron​

#!/bin/bash
# 1. Shebang
# 2. متغيرات البيئة
PATH=/usr/bin:/bin
# 3. متغيرات السكربت
LOG_FILE="/var/log/mon-script.log"
# 4. الدوال
# 5. الكود الرئيسي مع التسجيل

التسجيل​

#!/bin/bash
LOG_FILE="/var/log/mon-script.log"

log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "$LOG_FILE"
}

log "البداية"
# ... معالجة ...
log "النهاية"

إدارة الأخطاء​

#!/bin/bash
set -euo pipefail

# أو إدارة يدوية
if ! commande; then
echo "خطأ" | mail -s "خطأ في السكربت" admin@example.com
exit 1
fi

ملخص​

في هذا الفصل، تعلمت:

الدوال: التعريف، المعلمات، قيم الإرجاع
Cron: جدولة المهام التلقائية
الصياغة: * * * * * (دقيقة ساعة يوم شهر يوم_الأسبوع)
crontab: التحرير، العرض، الحذف
الأدلة: /etc/cron.d/, cron.hourly, إلخ.
الممارسة: سكربتات مع التسجيل، إدارة الأخطاء


الخطوات التالية​

الوحدة 7: الشبكة والتكوين
الوحدة 8: الخدمات والخادم (مع crons المتقدمة)


تم إنشاء الفصل في: ديسمبر 2024