Aller au contenu principal

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​

  1. Pourquoi utiliser des chemins absolus dans cron?

    • Le cron n'a pas le même PATH que votre shell
    • Les chemins relatifs peuvent échouer
  2. Quelle est la différence entre crontab utilisateur et système?

    • Utilisateur: crontab -e (fichier dans /var/spool/cron/)
    • Système: /etc/crontab ou /etc/cron.d/
  3. 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 crontab
  • man 5 crontab - Format du fichier crontab
  • systemctl --user list-timers - Voir les timers systemd
  • Ubuntu Cron Guide

Lab créé le: Décembre 2024 - Testé sur Ubuntu 24.04