Crontab

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Planification de tâches (ordonnanceur cron)
Commande crontab
Contexte Linux (paquet cron/vixie-cron), service crond/cron
Voir aussi man 5 crontab (syntaxe), man 1 crontab (commande)

crontab est l'outil de planification de tâches standard sous Linux : chaque utilisateur peut avoir son propre fichier crontab, exécuté par le démon cron (paquet vixie-cron ou cronie selon la distribution), en plus des crontabs système sous /etc/cron.d/ et des répertoires /etc/cron.{hourly,daily,weekly,monthly}.

Installation

yum install vixie-cron   # RHEL/CentOS
apt install cron         # Debian/Ubuntu

Syntaxe des 5 champs

# .---------------- minute (0 - 59)
# |  .------------- heure (0 - 23)
# |  |  .---------- jour du mois (1 - 31)
# |  |  |  .------- mois (1 - 12) ou jan,feb,mar,apr...
# |  |  |  |  .---- jour de la semaine (0 - 6, dimanche = 0 ou 7) ou sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  *  commande à exécuter
Champ Signification Plage
MIN Minute 0-59
HOUR Heure 0-23
DOM Jour du mois (Day Of Month) 1-31
MON Mois 1-12
DOW Jour de la semaine (Day Of Week) 0-6 (0 = dimanche)
CMD Commande à exécuter

Exemple : * * * * * /root/script.sh exécute le script à chaque minute, tous les jours.

Édition du crontab utilisateur

crontab -e                  # éditer le crontab de l'utilisateur courant
crontab -l                  # lister le crontab de l'utilisateur courant
crontab -l -u username       # afficher le crontab d'un autre utilisateur
crontab -r                  # supprimer le crontab de l'utilisateur courant (⚠️ sans confirmation)

Chaque crontab utilisateur est stocké dans /var/spool/cron/<username> (ou /var/spool/cron/crontabs/<username> selon la distribution) — ne jamais éditer ce fichier directement, toujours passer par crontab -e pour que cron recharge proprement les changements.

Lister les crontabs de tous les utilisateurs

for user in $(cut -f1 -d: /etc/passwd); do echo -e "\n==> $user:" && crontab -u "$user" -l 2>/dev/null; done

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

Pour déclarer une tâche en dehors des crontabs utilisateurs individuels (utile pour un paquet, un déploiement automatisé, ou une tâche versionnée) : contrairement au crontab utilisateur, ces fichiers ont un champ supplémentaire pour préciser l'utilisateur qui exécute la commande.

vi /etc/cron.d/mon_job
# MIN HOUR DOM MON DOW USER COMMANDE
* * * * * username /root/script.sh

Après création ou modification d'un fichier dans /etc/cron.d/, aucun redémarrage n'est nécessaire : cron surveille ce répertoire et recharge automatiquement.

Répertoires système (run-parts)

En plus de /etc/cron.d/, la plupart des distributions exécutent périodiquement tous les scripts exécutables déposés dans ces répertoires (via run-parts, lui-même déclenché par une entrée dans /etc/crontab) :

ls /etc/cron.hourly/    # exécuté toutes les heures
ls /etc/cron.daily/     # exécuté une fois par jour
ls /etc/cron.weekly/    # exécuté une fois par semaine
ls /etc/cron.monthly/   # exécuté une fois par mois

Alias spéciaux

@reboot     # exécuté une fois au démarrage, équivalent à rien (pas d'horaire)
@yearly     # une fois par an,   équivalent à "0 0 1 1 *"
@annually   # identique à @yearly
@monthly    # une fois par mois, équivalent à "0 0 1 * *"
@weekly     # une fois par semaine, équivalent à "0 0 * * 0"
@daily      # une fois par jour, équivalent à "0 0 * * *"
@hourly     # une fois par heure, équivalent à "0 * * * *"

Exemple : @reboot /home/xyz/myscript.sh.

Bonnes pratiques

  • Rediriger systématiquement la sortie pour éviter les mails cron intempestifs si aucune supervision n'est en place : * * * * * /root/script.sh >/dev/null 2>&1.
  • Le PATH de cron est minimal (souvent juste /usr/bin:/bin) — utiliser des chemins absolus dans les scripts et commandes plutôt que de compter sur le PATH interactif de l'utilisateur.
  • La variable MAILTO en tête de crontab permet de rediriger les mails de sortie vers une adresse précise (MAILTO=admin@example.com), ou de les couper avec MAILTO="".
  • Après un changement direct sur le service (rare, car crontab -e recharge déjà tout seul), un service crond restart (ou systemctl restart cron) force la relecture complète.

Voir aussi

  • man 5 crontab — syntaxe complète du fichier crontab
  • man 1 crontab — options de la commande crontab