Lab 6.4 - Cron et Crontab
Objectifs du Lab
À la fin de ce lab, vous serez capable de:
- Comprendre le système cron
- Créer des tâches planifiées avec crontab
- Gérer les crontabs utilisateur et système
- Monitorer l'exécution des tâches cron
- Résoudre les problèmes courants
- Utiliser systemd timers (alternative moderne)
Durée Estimée
45-60 minutes
Prérequis
- Ubuntu 24.04 installé et fonctionnel
- Accès utilisateur avec sudo
- Terminal ouvert
- Connaissances de base en ligne de commande
Exercice 1: Introduction à Cron
Étape 1: Vérifier le Service Cron
# Vérifier que cron est installé et actif
systemctl status cron
# Si non installé (normalement installé par défaut)
sudo apt update
sudo apt install cron
# Démarrer et activer
sudo systemctl enable cron
sudo systemctl start cron
Étape 2: Comprendre la Structure
# Voir les crontabs système
ls -la /etc/cron.*
# Voir les crontabs utilisateur
ls -la /var/spool/cron/crontabs/
# Voir le crontab de l'utilisateur actuel
crontab -l
Exercice 2: Crontab Utilisateur
Étape 1: Éditer le Crontab
# Éditer le crontab de l'utilisateur actuel
crontab -e
# La première fois, choisir un éditeur (nano recommandé)
Étape 2: Syntaxe Crontab
Format: minute heure jour mois jour-semaine commande
# Exemples de syntaxe:
# * * * * * = Toutes les minutes
# 0 * * * * = Toutes les heures (minute 0)
# 0 0 * * * = Tous les jours à minuit
# 0 0 * * 0 = Tous les dimanches à minuit
# */5 * * * * = Toutes les 5 minutes
Étape 3: Créer une Tâche Simple
# Créer un script de test
cat > ~/test-cron.sh << 'EOF'
#!/bin/bash
echo "Cron exécuté à $(date)" >> ~/cron-test.log
EOF
chmod +x ~/test-cron.sh
# Ajouter au crontab (exécuter toutes les minutes pour test)
crontab -e
# Ajouter cette ligne:
# * * * * * /home/$USER/test-cron.sh
# Voir le crontab
crontab -l
# Attendre 2-3 minutes, puis vérifier
cat ~/cron-test.log
Exercice 3: Tâches Courantes
Étape 1: Backup Quotidien
# Créer un script de backup
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
# Ajouter au crontab (tous les jours à 2h du matin)
crontab -e
# Ajouter:
# 0 2 * * * /home/$USER/backup-daily.sh >> /home/$USER/backup.log 2>&1
Étape 2: Nettoyage Hebdomadaire
# Script de nettoyage
cat > ~/cleanup-weekly.sh << 'EOF'
#!/bin/bash
# Supprimer les fichiers temporaires > 7 jours
find ~/tmp -type f -mtime +7 -delete 2>/dev/null
# Nettoyer les logs anciens
find ~/logs -name "*.log" -mtime +30 -delete 2>/dev/null
echo "Nettoyage effectué: $(date)"
EOF
chmod +x ~/cleanup-weekly.sh
# Ajouter au crontab (tous les dimanches à 3h)
crontab -e
# Ajouter:
# 0 3 * * 0 /home/$USER/cleanup-weekly.sh
Étape 3: Monitoring Système
# Script de monitoring
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
# Exécuter toutes les 5 minutes
crontab -e
# Ajouter:
# */5 * * * * /home/$USER/monitor-system.sh
Exercice 4: Variables d'Environnement
Étape 1: Configurer l'Environnement
# Le crontab n'a pas le même environnement que votre shell
# Il faut définir les variables nécessaires
crontab -e
# Ajouter en haut du fichier:
# PATH=/usr/bin:/bin
# SHELL=/bin/bash
# HOME=/home/$USER
# MAILTO=votre-email@example.com
# Exemple avec PATH défini
# */5 * * * * /usr/bin/curl http://example.com >> /tmp/curl.log 2>&1
Étape 2: Chemins Absolus
# Toujours utiliser des chemins absolus dans cron
# ❌ Mauvais:
# * * * * * script.sh
# ✅ Bon:
# * * * * * /home/$USER/script.sh
# Ou définir dans le script:
# #!/bin/bash
# cd /home/$USER
# ./script.sh
Exercice 5: Crontab Système
Étape 1: Crontab Système
# Éditer le crontab système
sudo crontab -e
# Ou créer un fichier dans /etc/cron.d/
sudo nano /etc/cron.d/mon-tache
# Format avec utilisateur:
# * * * * * utilisateur /chemin/vers/script.sh
# Exemple: backup système tous les jours à 1h
# 0 1 * * * root /usr/local/bin/system-backup.sh
Étape 2: Répertoires Cron Système
# /etc/cron.daily/ - Exécution quotidienne
ls -la /etc/cron.daily/
# /etc/cron.weekly/ - Exécution hebdomadaire
ls -la /etc/cron.weekly/
# /etc/cron.monthly/ - Exécution mensuelle
ls -la /etc/cron.monthly/
# /etc/cron.hourly/ - Exécution horaire
ls -la /etc/cron.hourly/
# Créer un script dans cron.daily
sudo nano /etc/cron.daily/mon-script
# Ajouter:
#!/bin/bash
# Votre script ici
# Rendre exécutable
sudo chmod +x /etc/cron.daily/mon-script
Exercice 6: Monitoring et Logs
Étape 1: Voir les Logs Cron
# Ubuntu 24.04 utilise systemd, les logs sont dans journalctl
sudo journalctl -u cron
# Voir les dernières entrées
sudo journalctl -u cron -n 50
# Suivre en temps réel
sudo journalctl -u cron -f
# Filtrer par utilisateur
sudo journalctl -u cron | grep $USER
# Voir les exécutions d'aujourd'hui
sudo journalctl -u cron --since today
Étape 2: Vérifier l'Exécution
# Script pour vérifier si cron a exécuté une tâche
cat > ~/check-cron.sh << 'EOF'
#!/bin/bash
SCRIPT="$HOME/test-cron.sh"
LOG="$HOME/cron-test.log"
# Vérifier dernière exécution
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
# Vérifier dans les logs système
echo "Logs système:"
sudo journalctl -u cron | grep "$SCRIPT" | tail -5
EOF
chmod +x ~/check-cron.sh
./check-cron.sh
Exercice 7: Dépannage
Étape 1: Problèmes Courants
# Problème: Script ne s'exécute pas
# Solution 1: Vérifier les permissions
chmod +x ~/mon-script.sh
# Solution 2: Vérifier les chemins
which commande-dans-script
# Solution 3: Tester manuellement
bash ~/mon-script.sh
# Solution 4: Vérifier les logs
sudo journalctl -u cron | tail -20
Étape 2: Debug
# Ajouter du logging dans le script
cat > ~/script-debug.sh << 'EOF'
#!/bin/bash
set -x # Mode debug
exec > /tmp/script-debug.log 2>&1
echo "Début: $(date)"
# Votre code ici
echo "Fin: $(date)"
EOF
# Dans crontab, rediriger aussi
# * * * * * /home/$USER/script-debug.sh >> /tmp/cron-debug.log 2>&1
Exercice 8: systemd Timers (Alternative Moderne)
Étape 1: Créer un Timer
# Créer un service
cat > ~/.config/systemd/user/backup.service << 'EOF'
[Unit]
Description=Backup quotidien
[Service]
Type=oneshot
ExecStart=/home/$USER/backup-daily.sh
EOF
# Créer un timer
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
# Recharger et activer
systemctl --user daemon-reload
systemctl --user enable backup.timer
systemctl --user start backup.timer
# Vérifier
systemctl --user list-timers
Vérification
Checklist
Vérifiez que vous pouvez:
- Éditer un crontab utilisateur
- Comprendre la syntaxe cron
- Créer des tâches planifiées
- Configurer les variables d'environnement
- Voir les logs cron
- Dépanner les problèmes courants
- Utiliser systemd timers (optionnel)
Questions de Réflexion
-
Pourquoi utiliser des chemins absolus dans cron?
- Le cron n'a pas le même PATH que votre shell
- Les chemins relatifs peuvent échouer
-
Quelle est la différence entre crontab utilisateur et système?
- Utilisateur:
crontab -e(fichier dans /var/spool/cron/) - Système:
/etc/crontabou/etc/cron.d/
- Utilisateur:
-
Quand utiliser systemd timers vs cron?
- systemd timers: Plus moderne, meilleure intégration
- cron: Plus simple, universellement supporté
Prochaines Étapes
- Chapitre 8.3: Cron Avancé et systemd Timers
- Module 11: Monitoring Crons et Alertes
- Module 12: Automatisation Complète
Ressources Ubuntu 24.04
man crontab- Documentation crontabman 5 crontab- Format du fichier crontabsystemctl --user list-timers- Voir les timers systemd- Ubuntu Cron Guide
Lab créé le: Décembre 2024 - Testé sur Ubuntu 24.04