الفصل 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