Planification de tâches sous Linux
Mise en place
Création d'un script bash de test
Créez le script suivant et enregistrez-le sous /home/user/script.sh (remplacez user par votre nom d'utilisateur).
#!/bin/bash
date=$(date)
user=$(whoami)
echo "Script exécuté à $date par $user" >> /home/user/log.txt
Rendez le script exécutable:
chmod +x /home/user/script.sh
Testez le script manuellement:
/home/user/script.sh
cat /home/user/log.txt
Première tâche cron
Éditer votre crontab
crontab -e
Si c'est la première fois, le système vous demandera de choisir un éditeur (choisissez nano si vous n'êtes pas certain).
Ajouter une tâche qui s'exécute toutes les minutes
Ajoutez cette ligne à la fin du fichier:
* * * * * /home/user/script.sh
Sauvegardez et quittez (Ctrl+X, puis Y, puis Entrée dans nano).
Vérifier que la tâche est enregistrée
crontab -l
Attendre et vérifier l'exécution
Attendez 2-3 minutes, puis vérifiez le fichier log:
cat /home/user/log.txt
Vous devriez voir plusieurs entrées, une par minute.
Consulter les logs système de cron
La localisation des logs de cron varie selon la distribution Linux et du système de journalisation utilisé.
Si vous utilisez une distribution basée sur Debian/Ubuntu avec rsyslog, vous pouvez consulter les logs de cron avec la commande suivante:
# Sur Ubuntu
grep CRON /var/log/syslog | tail -20
# Voir uniquement vos tâches
grep CRON /var/log/syslog | grep $(whoami)
Si vous utilisez une distribution basée sur Red Hat/CentOS avec rsyslog, les logs de cron se trouvent généralement dans /var/log/cron:
# Sur CentOS/Red Hat
grep CRON /var/log/cron | tail -20
Si votre système utilise systemd (comme les versions récentes d'Ubuntu, Fedora, etc.), vous devrez utiliser journalctl pour consulter les logs de cron:
sudo journalctl -u cron.service | tail -20
Supprimer la tâche de test
Rééditez la crontab:
crontab -e
Supprimez ou commentez la ligne (ajoutez # au début):
# * * * * * /home/user/script.sh
Script de sauvegarde avec redirection
Créer les répertoires nécessaires
mkdir -p ~/repertoire_a_sauvegarder
mkdir -p ~/sauvegardes
mkdir -p ~/logs
Créer du contenu à sauvegarder
echo "Fichier de test 1" > ~/repertoire_a_sauvegarder/fichier1.txt
echo "Fichier de test 2" > ~/repertoire_a_sauvegarder/fichier2.txt
Créer le script de sauvegarde
Créez le fichier ~/backup.sh:
#!/bin/bash
# Script de sauvegarde
dossier_source="$HOME/repertoire_a_sauvegarder"
dossier_destination="$HOME/sauvegardes"
date_actuelle=$(date +%Y%m%d_%H%M%S)
fichier_sauvegarde="${dossier_destination}/backup_${date_actuelle}.tar.gz"
# Créer l'archive de sauvegarde
tar -czf "$fichier_sauvegarde" "$dossier_source"
# Afficher un message de confirmation
echo "$(date): Sauvegarde effectuée - $fichier_sauvegarde"
Rendre le script exécutable et le tester
chmod +x ~/backup.sh
~/backup.sh
Vérifiez qu'une archive a été créée:
ls -lh ~/sauvegardes/
Planifier avec redirection vers un log
Éditez la crontab:
crontab -e
Ajoutez cette ligne (changez l'heure pour dans 2-3 minutes):
45 14 * * * /home/user/backup.sh >> /home/user/logs/backup.log 2>&1
Vérifier après l'exécution
Après l'heure programmée:
# Vérifier le log
cat ~/logs/backup.log
# Vérifier les archives créées
ls -lh ~/sauvegardes/
Gestion des variables d'environnement
Comparer l'environnement shell vs cron
Dans votre terminal, affichez votre PATH:
echo $PATH
Capturer le PATH de cron
Éditez la crontab:
crontab -e
Ajoutez cette ligne temporaire:
* * * * * echo $PATH > /tmp/cron-path.txt
Attendez 1 minute, puis comparez:
cat /tmp/cron-path.txt
echo "Mon PATH shell: $PATH"
Vous verrez que le PATH de cron est beaucoup plus limité. Cela peut causer des problèmes si votre script dépend de commandes non incluses dans ce PATH. Par exemple, si vous avez des scripts ou des programmes qui sont stockés dans des répertoires comme /usr/local/bin, ils ne seront pas trouvés par cron.
Pour résoudre ce problème, allez voir les solutions proposées dans les notes théoriques.
Nettoyer la tâche de test
crontab -e
# Supprimez la ligne avec /tmp/cron-path.txt
Crontab système
Voir la crontab système
cat /etc/crontab
Vous remarquerez premièrement que la crontab système inclut une colonne supplémentaire pour l'utilisateur, qui indique sous quel utilisateur la tâche doit s'exécuter.
Vous remarquerez également que quatre tâches sont déjà planifiées par défaut, correspondant aux scripts dans /etc/cron.daily, /etc/cron.hourly, etc.
Dans ces dossiers sont stockés des scripts qui s'exécutent automatiquement à ces intervalles.
ls -l /etc/cron.daily/
ls -l /etc/cron.hourly/
ls -l /etc/cron.weekly/
Vous pouvez ajouter vos propres scripts dans ces dossiers pour qu'ils s'exécutent automatiquement à ces intervalles. Le nom du script n'a pas d'importance, mais il doit être exécutable (chmod +x).
Créer un script dans /etc/cron.daily (nécessite sudo)
sudo nano /etc/cron.daily/mon-script-systeme
Ajoutez:
#!/bin/bash
echo "$(date): Tâche système exécutée" >> /var/log/mon-script.log
Rendez-le exécutable:
sudo chmod +x /etc/cron.daily/mon-script-systeme
Ce script s'exécutera automatiquement une fois par jour.
Ajouter une ligne dans /etc/cron.d
Vous pouvez également créer un fichier dans /etc/cron.d pour planifier des tâches avec une syntaxe similaire à celle de /etc/crontab.
sudo nano /etc/cron.d/mon-cron
Ajoutez:
# Exécuter un script tous les jours à 3h du matin
0 3 * * * root /home/user/script.sh
Cela exécutera script.sh tous les jours à 3h du matin en tant que root.
Cette méthode peut être plus utile que d'ajouter des lignes directement dans /etc/crontab, car elle:
- Permet de mieux organiser les tâches cron par fichier.
- Évite de modifier le fichier /etc/crontab directement, ce qui peut être dangereux.
- Permet de définir des variables d'environnement spécifiques au fichier cron.
Nettoyage final
Supprimez les crontab système et utilisateur que vous avez créées pour éviter toute exécution indésirable:
crontab -r
sudo rm /etc/cron.d/mon-cron
sudo rm /etc/cron.daily/mon-script-systeme