المختبر 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 (اختياري)
أسئلة للتفكير
-
لماذا تستخدم المسارات المطلقة في cron؟
- cron ليس لديه نفس PATH مثل shell الخاص بك
- المسارات النسبية قد تفشل
-
ما الفرق بين crontab المستخدم والنظام؟
- المستخدم:
crontab -e(ملف في /var/spool/cron/) - النظام:
/etc/crontabأو/etc/cron.d/
- المستخدم:
-
متى تستخدم مؤقتات systemd مقابل cron؟
- مؤقتات systemd: أكثر حداثة، تكامل أفضل
- cron: أبسط، مدعوم عالميًا
الخطوات التالية
- الفصل 8.3: Cron متقدم ومؤقتات systemd
- الوحدة 11: مراقبة Crons والتنبيهات
- الوحدة 12: الأتمتة الكاملة
موارد Ubuntu 24.04
man crontab- توثيق crontabman 5 crontab- صيغة ملف crontabsystemctl --user list-timers- عرض مؤقتات systemd- دليل Ubuntu Cron
تم إنشاء المختبر في: ديسمبر 2024 - تم اختباره على Ubuntu 24.04