← Sommaire SkyLinux

Leçon 73 : Cron — Automatiser les tâches sous Linux

Introduction

Cron est le gestionnaire de tâches planifiées le plus utilisé sous Linux. Il permet d'automatiser l'exécution de commandes ou de scripts à des intervalles réguliers : chaque jour à minuit, chaque lundi à 8h, tous les 15 minutes… C'est un outil indispensable pour tout administrateur système ou utilisateur Linux avancé.

Le service cron

Sur les systèmes utilisant systemd, le service cron s'appelle généralement cron ou crond. Il tourne en arrière-plan et vérifie toutes les minutes s'il doit exécuter une tâche.

# Vérifier que cron tourne systemctl status cron # Le démarrer automatiquement au boot systemctl enable cron # Démarrer maintenant systemctl start cron # Redémarrer après modification systemctl restart cron

Le format cron (les 5 champs)

Chaque ligne d'une crontab suit ce format :

# ┌───────────── minute (0-59) # │ ┌───────────── heure (0-23) # │ │ ┌───────────── jour du mois (1-31) # │ │ │ ┌───────────── mois (1-12) # │ │ │ │ ┌───────────── jour de la semaine (0-7, 0 et 7 = dimanche) # │ │ │ │ │ # │ │ │ │ │ # * * * * * commande

Les caractères spéciaux

CaractèreSignificationExemple
*N'importe quelle valeur* * * * * = chaque minute
,Liste de valeurs1,15 * * * * = minutes 1 et 15
-Plage de valeurs9-17 * * * * = de 9h à 17h
/Périodicité (step)*/5 * * * * = toutes les 5 minutes

Exemples courants

# Toutes les minutes * * * * * /opt/mon-script.sh # Toutes les 5 minutes */5 * * * * /opt/mon-script.sh # Toutes les heures (à la minute 0) 0 * * * * /opt/mon-script.sh # Chaque jour à 3h du matin 0 3 * * * /opt/mon-script.sh # Chaque lundi à 8h 0 8 * * 1 /opt/mon-script.sh # Chaque 1er du mois à midi 0 12 1 * * /opt/mon-script.sh # Du lundi au vendredi à 9h 0 9 * * 1-5 /opt/mon-script.sh # Toutes les 30 minutes de 9h à 17h */30 9-17 * * * /opt/mon-script.sh # Tous les 3 mois, le 15 du mois à 2h 0 2 15 */3 * /opt/mon-script.sh

Jours de la semaine

ValeurJour
0Dimanche
1Lundi
2Mardi
3Mercredi
4Jeudi
5Vendredi
6Samedi
7Dimanche

Gestion de la crontab

crontab -e ouvre l'éditeur pour modifier la crontab de l'utilisateur actuel :

# Éditer sa crontab crontab -e # Voir sa crontab sans éditer crontab -l # Supprimer toute la crontab (demande confirmation) crontab -r # Supprimer sans confirmation crontab -r -i

Éditeurs et sélection

La première utilisation de crontab -e demande de choisir un éditeur. nano est recommandé pour les débutants :

# Sélectionner nano par défaut select-editor # Ou forcer nano EDITOR=nano crontab -e

Écrire une crontab complète

Exemple de crontab avec commentaires et variables d'environnement :

# ┌── Variables d'environnement # │ SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin MAILTO=contact@hinni-swiss.com # ┌── Backup quotidien à 3h # │ 0 3 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1 # ┌── Nettoyage des logs tous les dimanches à 4h # │ 0 4 * * 0 /opt/scripts/cleanup-logs.sh # ┌── Surveillance toutes les 5 minutes # │ */5 * * * * /opt/scripts/check-services.sh

Redirections et logs

Par défaut, cron envoie la sortie par e-mail à l'utilisateur. Pour éviter cela ou rediriger ailleurs :

# Ne pas envoyer d'e-mail (rediriger vers /dev/null) 0 3 * * * /opt/scripts/backup.sh > /dev/null 2>&1 # Ajouter la date au log 0 3 * * * /opt/scripts/backup.sh >> /var/log/backup_$(date +\%Y\%m\%d).log 2>&1 # Écrire un log propre avec horodatage 0 3 * * * /opt/scripts/backup.sh 2>&1 | logger -t backup # Les erreurs seulement dans un fichier 0 3 * * * /opt/scripts/backup.sh 2>> /var/log/backup_errors.log

Crontab système

Il existe aussi des crontabs système dans /etc/cron.d/ et /etc/cron.daily/, /etc/cron.hourly/, etc. :

# Emplacements système /etc/crontab # Crontab principale du système /etc/cron.d/ # Fichiers cron supplémentaires /etc/cron.daily/ # Scripts exécutés quotidiennement /etc/cron.hourly/ # Scripts exécutés chaque heure /etc/cron.weekly/ # Scripts exécutés chaque semaine /etc/cron.monthly/ # Scripts exécutés chaque mois # Ajouter une tâche au système sudo nano /etc/cron.d/mon-script # Format complet (inclut l'utilisateur) : # 0 3 * * * root /opt/scripts/backup.sh

Restriction d'accès (cron.allow / cron.deny)

On peut autoriser ou interdire l'usage de cron par utilisateur :

# Autoriser certains utilisateurs sudo nano /etc/cron.allow # david # marie # Interdire certains utilisateurs sudo nano /etc/cron.deny # guest # testuser

Vérifier le fonctionnement

Quelques tricks pour vérifier que cron fonctionne correctement :

# Voir les dernières entrées du journal systemd journalctl -u cron -e # Ou via syslog grep CRON /var/log/syslog # Lister les tâches cron actives sudo systemctl status cron # Simuler une exécution (tester avant de planifier) run-parts /etc/cron.hourly --dry-run

Anacron — Pour les machines non allumées en permanence

cron ne lance pas une tâche manquée si la machine était éteinte. anacron comble ce manque en exécutant les tâches en retard au prochain démarrage :

# Installer anacron sudo apt install anacron # Fichier de configuration /etc/anacrontab # Format : # periode delai identifiant commande # jours min nom script 1 5 daily /opt/scripts/backup.sh 7 10 weekly /opt/scripts/cleanup.sh

Exemple de script pour cron

Un bon script lancé par cron doit être autonome (chemins absolus, gestion des erreurs) :

#!/bin/bash # Script de backup — à planifier avec cron DATE=$(date +\%Y\%m\%d_\%H\%M\%S) SOURCE="/home/david/documents" DEST="/backup/docs_\${DATE}.tar.gz" LOG="/var/log/backup.log" echo "[${DATE}] Début du backup" >> "${LOG}" # Vérifier que la source existe if [ ! -d "${SOURCE}" ]; then echo "[${DATE}] ERREUR: Source ${SOURCE} introuvable" >> "${LOG}" exit 1 fi # Créer l'archive tar -czf "${DEST}" "${SOURCE}" 2>> "${LOG}" if [ $? -eq 0 ]; then echo "[${DATE}] Backup réussi: ${DEST}" >> "${LOG}" else echo "[${DATE}] ERREUR lors du backup" >> "${LOG}" exit 1 fi echo "[${DATE}] Fin du backup" >> "${LOG}"

Résumé