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

المختبر 6.4 - Cron و Crontab

أهداف المختبر​

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

  • فهم نظام cron
  • إنشاء مهام مجدولة باستخدام crontab
  • إدارة crontabs للمستخدم والنظام
  • مراقبة تنفيذ مهام cron
  • حل المشاكل الشائعة
  • استخدام مؤقتات systemd (بديل حديث)

المدة المقدرة​

45-60 دقيقة

المتطلبات الأساسية​

  • تثبيت Ubuntu 24.04 وتشغيله
  • وصول مستخدم مع sudo
  • فتح الطرفية
  • معرفة أساسية بخط الأوامر

التمرين 1: مقدمة إلى Cron​

الخطوة 1: التحقق من خدمة Cron​

# التحقق من أن cron مثبت ونشط
systemctl status cron

# إذا لم يكن مثبتًا (عادةً ما يكون مثبتًا افتراضيًا)
sudo apt update
sudo apt install cron

# بدء وتفعيل
sudo systemctl enable cron
sudo systemctl start cron

الخطوة 2: فهم الهيكل​

# عرض crontabs النظام
ls -la /etc/cron.*

# عرض crontabs المستخدم
ls -la /var/spool/cron/crontabs/

# عرض crontab للمستخدم الحالي
crontab -l

التمرين 2: Crontab المستخدم​

الخطوة 1: تحرير Crontab​

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

# في المرة الأولى، اختر محررًا (يوصى بـ nano)

الخطوة 2: صيغة Crontab​

الصيغة: minute heure jour mois jour-semaine commande

# أمثلة على الصيغة:
# * * * * * = كل دقيقة
# 0 * * * * = كل ساعة (الدقيقة 0)
# 0 0 * * * = كل يوم عند منتصف الليل
# 0 0 * * 0 = كل أحد عند منتصف الليل
# */5 * * * * = كل 5 دقائق

الخطوة 3: إنشاء مهمة بسيطة​

# إنشاء سكربت اختبار
cat > ~/test-cron.sh << 'EOF'
#!/bin/bash
echo "Cron exécuté à $(date)" >> ~/cron-test.log
EOF

chmod +x ~/test-cron.sh

# إضافة إلى crontab (تنفيذ كل دقيقة للاختبار)
crontab -e
# إضافة هذا السطر:
# * * * * * /home/$USER/test-cron.sh

# عرض crontab
crontab -l

# الانتظار 2-3 دقائق، ثم التحقق
cat ~/cron-test.log

التمرين 3: المهام الشائعة​

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

# إنشاء سكربت النسخ الاحتياطي
cat > ~/backup-daily.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="$HOME/backups"
DATE=$(date +%Y%m%d)
mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/backup-$DATE.tar.gz" ~/Documents 2>/dev/null
echo "Backup créé: backup-$DATE.tar.gz"
EOF

chmod +x ~/backup-daily.sh

# إضافة إلى crontab (كل يوم في الساعة 2 صباحًا)
crontab -e
# إضافة:
# 0 2 * * * /home/$USER/backup-daily.sh >> /home/$USER/backup.log 2>&1

الخطوة 2: التنظيف الأسبوعي​

# سكربت التنظيف
cat > ~/cleanup-weekly.sh << 'EOF'
#!/bin/bash
# حذف الملفات المؤقتة > 7 أيام
find ~/tmp -type f -mtime +7 -delete 2>/dev/null
# تنظيف السجلات القديمة
find ~/logs -name "*.log" -mtime +30 -delete 2>/dev/null
echo "Nettoyage effectué: $(date)"
EOF

chmod +x ~/cleanup-weekly.sh

# إضافة إلى crontab (كل أحد في الساعة 3 صباحًا)
crontab -e
# إضافة:
# 0 3 * * 0 /home/$USER/cleanup-weekly.sh

الخطوة 3: مراقبة النظام​

# سكربت المراقبة
cat > ~/monitor-system.sh << 'EOF'
#!/bin/bash
LOG="$HOME/system-monitor.log"
{
echo "=== $(date) ==="
echo "CPU: $(top -bn1 | grep 'Cpu(s)' | awk '{print $2}')"
echo "Mémoire: $(free -h | grep Mem | awk '{print $3"/"$2}')"
echo "Disque: $(df -h / | tail -1 | awk '{print $5}')"
echo "---"
} >> "$LOG"
EOF

chmod +x ~/monitor-system.sh

# تنفيذ كل 5 دقائق
crontab -e
# إضافة:
# */5 * * * * /home/$USER/monitor-system.sh

التمرين 4: متغيرات البيئة​

الخطوة 1: تكوين البيئة​

# crontab ليس لديه نفس البيئة مثل shell الخاص بك
# يجب تحديد المتغيرات اللازمة

crontab -e
# إضافة في أعلى الملف:
# PATH=/usr/bin:/bin
# SHELL=/bin/bash
# HOME=/home/$USER
# MAILTO=بريدك-الإلكتروني@example.com

# مثال مع PATH محدد
# */5 * * * * /usr/bin/curl http://example.com >> /tmp/curl.log 2>&1

الخطوة 2: المسارات المطلقة​

# دائمًا استخدام المسارات المطلقة في cron
# ❌ خطأ:
# * * * * * script.sh

# ✅ صحيح:
# * * * * * /home/$USER/script.sh

# أو تحديد في السكربت:
# #!/bin/bash
# cd /home/$USER
# ./script.sh

التمرين 5: Crontab النظام​

الخطوة 1: Crontab النظام​

# تحرير crontab النظام
sudo crontab -e

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

# صيغة مع المستخدم:
# * * * * * utilisateur /chemin/vers/script.sh

# مثال: النسخ الاحتياطي للنظام كل يوم في الساعة 1
# 0 1 * * * root /usr/local/bin/system-backup.sh

الخطوة 2: أدلة Cron النظام​

# /etc/cron.daily/ - تنفيذ يومي
ls -la /etc/cron.daily/

# /etc/cron.weekly/ - تنفيذ أسبوعي
ls -la /etc/cron.weekly/

# /etc/cron.monthly/ - تنفيذ شهري
ls -la /etc/cron.monthly/

# /etc/cron.hourly/ - تنفيذ كل ساعة
ls -la /etc/cron.hourly/

# إنشاء سكربت في cron.daily
sudo nano /etc/cron.daily/mon-script
# إضافة:
#!/bin/bash
# سكربتك هنا

# جعله قابل للتنفيذ
sudo chmod +x /etc/cron.daily/mon-script

التمرين 6: المراقبة والسجلات​

الخطوة 1: عرض سجلات Cron​

# Ubuntu 24.04 يستخدم systemd، السجلات في journalctl
sudo journalctl -u cron

# عرض الإدخالات الأخيرة
sudo journalctl -u cron -n 50

# المتابعة في الوقت الحقيقي
sudo journalctl -u cron -f

# التصفية حسب المستخدم
sudo journalctl -u cron | grep $USER

# عرض تنفيذات اليوم
sudo journalctl -u cron --since today

الخطوة 2: التحقق من التنفيذ​

# سكربت للتحقق مما إذا كان cron قد نفذ مهمة
cat > ~/check-cron.sh << 'EOF'
#!/bin/bash
SCRIPT="$HOME/test-cron.sh"
LOG="$HOME/cron-test.log"

# التحقق من آخر تنفيذ
if [ -f "$LOG" ]; then
LAST_RUN=$(tail -1 "$LOG" | awk '{print $4, $5}')
echo "Dernière exécution: $LAST_RUN"
else
echo "Aucune exécution trouvée"
fi

# التحقق في سجلات النظام
echo "Logs système:"
sudo journalctl -u cron | grep "$SCRIPT" | tail -5
EOF

chmod +x ~/check-cron.sh
./check-cron.sh

التمرين 7: استكشاف الأخطاء وإصلاحها​

الخطوة 1: المشاكل الشائعة​

# المشكلة: السكربت لا ينفذ
# الحل 1: التحقق من الأذونات
chmod +x ~/mon-script.sh

# الحل 2: التحقق من المسارات
which commande-dans-script

# الحل 3: الاختبار يدويًا
bash ~/mon-script.sh

# الحل 4: التحقق من السجلات
sudo journalctl -u cron | tail -20

الخطوة 2: التصحيح​

# إضافة تسجيل في السكربت
cat > ~/script-debug.sh << 'EOF'
#!/bin/bash
set -x # وضع التصحيح
exec > /tmp/script-debug.log 2>&1
echo "Début: $(date)"
# كودك هنا
echo "Fin: $(date)"
EOF

# في crontab، إعادة التوجيه أيضًا
# * * * * * /home/$USER/script-debug.sh >> /tmp/cron-debug.log 2>&1

التمرين 8: مؤقتات systemd (بديل حديث)​

الخطوة 1: إنشاء مؤقت​

# إنشاء خدمة
cat > ~/.config/systemd/user/backup.service << 'EOF'
[Unit]
Description=Backup quotidien

[Service]
Type=oneshot
ExecStart=/home/$USER/backup-daily.sh
EOF

# إنشاء مؤقت
cat > ~/.config/systemd/user/backup.timer << 'EOF'
[Unit]
Description=Timer pour backup quotidien

[Timer]
OnCalendar=daily
OnCalendar=02:00
Persistent=true

[Install]
WantedBy=timers.target
EOF

# إعادة التحميل والتفعيل
systemctl --user daemon-reload
systemctl --user enable backup.timer
systemctl --user start backup.timer

# التحقق
systemctl --user list-timers

التحقق​

قائمة التحقق​

تحقق من أنك تستطيع:

  • تحرير crontab للمستخدم
  • فهم صيغة cron
  • إنشاء مهام مجدولة
  • تكوين متغيرات البيئة
  • عرض سجلات cron
  • استكشاف المشاكل الشائعة وإصلاحها
  • استخدام مؤقتات systemd (اختياري)

أسئلة للتفكير​

  1. لماذا تستخدم المسارات المطلقة في cron؟

    • cron ليس لديه نفس PATH مثل shell الخاص بك
    • المسارات النسبية قد تفشل
  2. ما الفرق بين crontab المستخدم والنظام؟

    • المستخدم: crontab -e (ملف في /var/spool/cron/)
    • النظام: /etc/crontab أو /etc/cron.d/
  3. متى تستخدم مؤقتات systemd مقابل cron؟

    • مؤقتات systemd: أكثر حداثة، تكامل أفضل
    • cron: أبسط، مدعوم عالميًا

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

  • الفصل 8.3: Cron متقدم ومؤقتات systemd
  • الوحدة 11: مراقبة Crons والتنبيهات
  • الوحدة 12: الأتمتة الكاملة

موارد Ubuntu 24.04​

  • man crontab - توثيق crontab
  • man 5 crontab - صيغة ملف crontab
  • systemctl --user list-timers - عرض مؤقتات systemd
  • دليل Ubuntu Cron

تم إنشاء المختبر في: ديسمبر 2024 - تم اختباره على Ubuntu 24.04