Passer au contenu principal

Administration (Linux)

Tâches planifiées : cron

Automatiser des tâches récurrentes est au coeur de l'administration système. cron est le planificateur de référence sur Linux : il exécute des commandes selon un calendrier défini, sans intervention manuelle.

La syntaxe crontab

Une entrée cron suit ce format :

minute  heure  jour_du_mois  mois  jour_de_semaine  commande
*       *      *             *     *                commande

Le caractère * signifie "toutes les valeurs". Exemples :

0 2 * * *     /usr/bin/backup.sh     # tous les jours à 2h00
*/15 * * * *  /usr/bin/check.sh      # toutes les 15 minutes
0 9 * * 1     /usr/bin/report.sh     # chaque lundi à 9h00
0 0 1 * *     /usr/bin/monthly.sh    # le 1er de chaque mois à minuit

Gérer sa crontab

crontab -e               # éditer la crontab de l'utilisateur courant
crontab -l               # afficher la crontab
crontab -r               # supprimer la crontab (irréversible)
crontab -u romain -e     # éditer la crontab d'un autre utilisateur (root)

La crontab de chaque utilisateur est stockée dans /var/spool/cron/crontabs/.

Cron système : /etc/cron.d/

Pour les tâches système, on préfère les fichiers dans /etc/cron.d/. Ils ajoutent un champ utilisateur :

# /etc/cron.d/backup
0 3 * * * root /usr/local/bin/backup.sh

Les répertoires /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ acceptent des scripts directement, sans syntaxe cron : ils sont exécutés automatiquement aux fréquences correspondantes.

Variables d'environnement

L'environnement cron est épuré : pas de PATH complet, pas de variables utilisateur. Toujours utiliser des chemins absolus, et définir les variables nécessaires en tête de crontab :

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=admin@exemple.fr

0 4 * * * /usr/local/bin/backup.sh

systemd timers

Sur les systèmes modernes, systemd timers remplacent avantageusement cron pour les services système : meilleure gestion des dépendances, logs via journald, exécution automatique après un raté. Cron reste pertinent pour les tâches utilisateur et les scripts simples.

systemctl list-timers         # lister les timers actifs
systemctl list-timers --all   # avec les timers inactifs

En pratique

Deux erreurs classiques avec cron : oublier les chemins absolus (/usr/bin/python3 et non python3), et ne pas gérer les sorties. Par défaut, cron envoie la sortie par email. Sur un serveur sans MTA configuré, elle disparaît silencieusement. Rediriger explicitement : commande >> /var/log/ma-tache.log 2>&1. Pour déboguer une crontab qui ne s'exécute pas : journalctl -u cron ou grep cron /var/log/syslog.