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