Jump to content

cron (Français)

From ArchWiki

État de la traduction: Cet article est la version francophone de Cron. Date de la dernière traduction: 2026-01-13. Vous pouvez aider à synchroniser la traduction s'il y a eu des changements dans la version anglaise.

Selon Wikipedia :

cron est un programme qui permet aux utilisateurs des systèmes Unix d’exécuter automatiquement des scripts, des commandes ou des logiciels à une date et une heure spécifiée à l’avance, ou selon un cycle défini à l’avance. Il est généralement utilisé pour automatiser la maintenance ou l'administration du système.

Installation

Il existe de nombreuses implémentations de cron, mais aucune d'entre elles n'est installée par défaut car le système de base utilise des timers systemd à la place.

Paquets disponibles :

Consultez Gentoo:Cron/fr, qui propose des comparaisons.

Configuration

Le daemon cron analyse un fichier de configuration appelé crontab(5). Chaque utilisateur du système peut maintenir un fichier crontab distinct pour programmer des commandes individuellement. Le crontab de l'utilisateur root est utilisé pour planifier les tâches de l'ensemble du système (bien que les utilisateurs puissent choisir d'utiliser /etc/crontab ou le répertoire /etc/cron.d, selon l'implémentation de cron qu'ils choisissent).

Activation et démarrage automatique

Après l'installation, le daemon ne sera pas activé par défaut. Le paquet installé fournit probablement un service, qui peut être contrôlé par systemctl. Par exemple, cronie utilise cronie.service.

Consultez /etc/cron.daily/ et les répertoires similaires pour consulter les tâches présentes. L'activation du service de cron les déclenchera tous.

Note Consultez #Traitement asynchrone des tâches pour des précisions sur le lancement de tâches qui tient compte des situations où le système était éteint à l'heure prévue de leur execution.

Commandes de base

Les crontabs ne doivent jamais être modifiés directement ; vous devez plutôt utiliser le programme crontab pour travailler avec vos crontabs.

Pour visualiser vos crontabs :

$ crontab -l

Pour modifier vos crontabs :

$ crontab -e

Pour supprimer vos crontabs :

$ crontab -r

Si vous avez une crontab enregistrée et que vous souhaitez écraser complètement votre ancienne crontab :

$ crontab saved_crontab_filename

Pour écraser une crontab à partir de la ligne de commande (Wikipedia:fr:Flux standard#Entrée standard), utilisez

$ crontab - 

Pour modifier la crontab de quelqu'un d'autre :

# crontab -u nom d'utilisateur -e

Ce même format (ajouter -u nom d'utilisateur à une commande) fonctionne également pour lister et supprimer les crontabs.

Format de la crontab

Le format de base d'un crontab est un ensemble de 6 valeurs séparées par des espaces, dans l'ordre suivant :

  • minute entre 0 et 59.
  • heure entre 0 et 23.
  • jour_du_mois entre 1 et 31.
  • mois entre 1 et 12.
  • jour_de_la_semaine entre 0 et 6, avec 0 pour le dimanche.
  • commande qui est le processus à lancer.

Pour affiner votre organisation, vous pouvez également utiliser l'un des symboles suivants :

Symbole Description
* Caractère générique, spécifie tous les intervalles de temps possibles
, Liste de plusieurs valeurs séparées par une virgule.
- Spécifie un intervalle entre deux nombres, séparés par un trait d'union
/ Spécifier une périodicité/fréquence à l'aide d'une barre oblique

Par exemple, la ligne :

*/5 9-16 * 1-5,9-12 1-5 ~/bin/j_adore_cron.sh

exécutera le script j_adore_cron.sh à intervalles de cinq minutes de 9 h à 16 h 55 les jours de semaine, sauf pendant les mois de juin, juillet et août.

De plus, crontab possède quelques mots-clés spéciaux :

Keyword Description
@reboot au démarrage
@yearly une fois par an
@annually identique à @yearly
@monthly une fois par mois
@weekly une fois par semaine
@daily une fois par jour
@midnight identique @daily
@hourly une fois par heure

Par exemple :

@reboot ~/bin/j_adore_cron.sh

exécutera le script j_adore_cron.sh au démarrage.

Cronie

Le fichier /etc/cron.deny inclut la liste des utilisateurs non autorisés à utiliser crontab, sans ce fichier, seuls les utilisateurs listés dans /etc/cron.allow peuvent l'utiliser.

Note
  • Cronie utilise run-parts pour exécuter les scripts dans les différents répertoires. Les noms de fichiers ne doivent pas inclure de point (.) car run-parts, dans son mode par défaut, les ignorera silencieusement (consultez run-parts(8)). Les noms doivent être composés uniquement de lettres majuscules et minuscules, de chiffres, de traits de soulignement et de traits d'union en moins.
  • La sortie de systemctl status cronie peut afficher un message tel que CAN'T OPEN (/etc/crontab) : No such file or directory. Cependant, ceci peut être simplement ignoré puisque cronie n'en a pas besoin.
  • Cronie est exigeant quant aux permissions pour /etc/cron.d/0hourly. Aucune des tâches de /etc/cron.d/{hourly,weekly,daily} ... etc ne sera exécutée (y compris le lanceur anacron) si /etc/cron.d/0hourly est endommagé ou a des permissions incorrectes. pacman -Qkk cronie peut montrer si vous avez de tels problèmes.
Astuce Pour empêcher l'envoi de la sortie et arrêter l'alerte par courriel, ajoutez >/dev/null 2>&1 à la fin de la ligne de chaque tâche cron pour rediriger la sortie vers /dev/null.
0 1 5 10 * /path/to/script.sh >/dev/null 2>&1
Vous pouvez également définir la variable MAILTO="" dans votre fichier crontab pour désactiver les alertes courriel.

Dcron

Dcron suit le format crontab habituel, mais permet d'ajouter les balises ID=nom_de_tâche et AFTER=.

Consultez crontab(1) pour plus d'informations et des exemples de configuration.

Fcron

Si vous remplacez cronie par fcron, sachez que le répertoire de spool est /var/spool/fcron et que la commande fcrontab est utilisée à la place de crontab pour modifier les crontabs de l'utilisateur. Ces crontabs sont stockés dans un format binaire avec la version texte à côté sous le nom de foo.orig dans le répertoire spool. Tous les scripts qui modifient manuellement les crontabs des utilisateurs peuvent avoir besoin d'être ajustés en raison de cette différence de comportement.

Un script rapide qui peut aider à convertir les crontabs utilisateurs traditionnels au format fcron :

cd /var/spool/cron && (
 for ctab in * ; do
  fcrontab ${ctab} -u ${ctab}
 done
)

Consultez également le fil de discussion du forum anglais.

Exemples

L'entrée :

01 * * * * /bin/echo "Salut, le monde !"

exécute la commande /bin/echo "Salut, le monde !" à la première minute de chaque heure de chaque jour de chaque mois (c'est-à-dire à 12:01, 1:01, 2:01, etc.).

De même :

*/5 * * jan mon-fri /bin/echo "Salut, le monde !"

exécute le même travail toutes les cinq minutes les jours de la semaine pendant le mois de janvier (c'est-à-dire à 12:00, 12:05, 12:10, etc.).

La ligne :

*/5 9-16 * 1-5,9-12 1-5 /home/user/bin/j_adore_cron.sh

exécutera le script j_adore_cron.sh à intervalles de cinq minutes de 9 h à 17 h (à l'exception de 17 h) tous les jours de la semaine (du lundi au vendredi) de chaque mois, sauf en été (juin, juillet et août).

Voici quelques exemples autodescriptifs de tâches cron :

#  mm  hh   DD  MM     W  programme [--option]...  (W = jour de la semaine [Sun=0])
   20   4                 echo "Il est actuellement 4 h 20 du matin."
   30  15   25  12        echo "Il est 15 h 30 le jour de Noël."
   30   3    *   *     *  echo "Rappelez-moi qu'il est 3 h 30 tous les jours."
   0    *    *   *     *  echo "C'est le début d'une nouvelle heure."
   0    6 1,15   *     *  echo "À 6 h du matin les 1er et 15 de chaque mois."
   0    6    *   * 2,3,5  echo "À 6 h du matin les mardis, mercredis et vendredis."
   59  23    *   *   1-5  echo "Juste avant minuit les jours de semaine."
   21  01    *   *     *  systemctl poweroff --message="Arrêt comme tous les jours à 21h01."
   0  */2    *   *     *  echo "Toutes les deux heures."
   0   20    *   *     4  echo "20 h le jeudi."
   0   20    *   *   Thu  echo "20 h le jeudi."
*/15 9-17    *   *   1-5  echo "Toutes les 15 minutes de 9 h à 17 h en semaine."
@yearly                   echo "Bonne année !"

Trucs et astuces

Éditeur par défaut

Pour utiliser un autre éditeur par défaut, définissez la variable d'environnement EDITOR dans un script d'initialisation du shell comme décrit dans les variables d'environnement.

En tant qu'utilisateur normal, su devra être utilisé au lieu de sudo pour que la variable d'environnement soit tirée correctement :

$ su -c "crontab -e"

Pour avoir un alias à cette printf est nécessaire pour porter la chaîne arbitraire car su se lance dans un nouveau shell :

alias scron="su -c $(printf "%q " "crontab -e")"

Gestion des erreurs des tâches

cron enregistre la sortie de stdout et stderr et tente de l'envoyer par courriel aux boites des utilisateurs via la commande sendmail. Cronie désactive la sortie du courrier si /usr/bin/sendmail n'est pas trouvé. Pour que le courrier soit écrit dans la boite d'un utilisateur, un daemon smtp doit tourner sur le système, par exemple opensmtpd. Sinon, vous pouvez installer un paquet qui fournit la commande sendmail et le configurer pour envoyer du courrier à un serveur de courrier distant. Vous pouvez également enregistrer les messages en utilisant l'option -m et en écrivant un script personnalisé.

Astuce On peut envoyer la sortie aux utilisateurs du système local en utilisant Postfix#Local mail.
  1. Éditez l'unité cronie.service.
  2. Installez esmtpAUR, msmtp, opensmtpd, sSMTP, ou écrire un script personnalisé.

Exemple avec sSMTP

sSMTP est un émulateur de sendmail qui envoie des courriels d'un ordinateur local vers un serveur smtp. Bien qu'il n'y ait actuellement aucun mainteneur actif, il reste de loin le moyen le plus simple de transférer du courrier vers un mailhub configuré. Il n'y a pas de daemons à exécuter et la configuration peut être aussi simple que l'édition de 3 lignes dans un seul fichier de configuration (si votre hôte est autorisé à relayer des courriels non authentifiés par le biais de votre mailhub). sSMTP ne reçoit pas de courriel, ne développe pas d'alias et ne gère pas de file d'attente.

Installez ssmtpAUR, qui crée un lien symbolique de /usr/bin/sendmail vers /usr/bin/ssmtp. Vous devez ensuite éditer /etc/ssmtp/ssmtp.conf. Consultez sSMTP pour plus de détails. La création d'un lien symbolique vers /usr/bin/sendmail garantit que les programmes comme S-nail (ou tout autre paquets qui fournit /usr/bin/mail) fonctionneront sans modification.

Redémarrez cronie.service pour vous assurer qu'il détecte que vous avez maintenant un /usr/bin/sendmail installé.

Exemple avec msmtp

Installez msmtp-mta, qui crée un lien symbolique de /usr/bin/sendmail vers /usr/bin/msmtp. Redémarrez cronie.service pour vous assurer qu'elle détecte la nouvelle commande sendmail. Vous devez ensuite fournir un moyen pour msmtp de convertir votre nom d'utilisateur en adresse courriel.

Ajoutez la ligne MAILFROM à votre crontab:

MAILFROM=your@email.com
Note Sans MAILFROM, le serveur SMTP peut signaler des erreurs d'en-tête.

Ensuite, soit vous ajoutez la ligne MAILTO à votre crontab, comme ceci :

MAILTO=your@email.com

ou créez /etc/msmtprc et ajoutez cette ligne :

alias /etc/aliases

et créez /etc/aliases :

your_username: your@email.com
# Optional:
default: your@email.com

Puis modifiez la configuration du daemon cronie en remplaçant la commande ExecStart par :

ExecStart=/usr/bin/crond -n -m'/usr/bin/msmtp -t'

Exemple avec esmtp

Installez esmtpAUR et procmailAUR.

Après l'installation, configurez le routage :

/etc/esmtprc
identity myself@myisp.com
       hostname mail.myisp.com:25
       username "myself"
       password "secret"
       starttls enabled
       default
mda "/usr/bin/procmail -d %T"

Procmail a besoin des privilèges root pour fonctionner en mode livraison mais ce n'est pas un problème si vous exécutez les tâches de cron en root de toute façon.

Pour tester que tout fonctionne correctement, créez un fichier message.txt avec "message de test" dedans.

Depuis le même répertoire, exécutez :

$ sendmail nom_utilisateur < message.txt 

puis :

$ cat /var/spool/mail/nom_d_utilisateur

Vous devriez maintenant consulter le message de test ainsi que l'heure et la date de son envoi.

La sortie d'erreur de tous les tâches sera maintenant redirigée vers /var/spool/mail/user_name.

En raison du problème de privilège, il est difficile de créer et d'envoyer des courriels à root (par exemple, su -c ""). Vous pouvez demander à esmtp de transférer tous les courriels de root à un utilisateur ordinaire avec :

/etc/esmtprc
force_mda="user-name"
Note Si le test ci-dessus n'a pas fonctionné, vous pouvez essayer de créer une configuration locale dans ~/.esmtprc avec le même contenu.

Exécutez la commande suivante pour vous assurer qu'elle dispose de la bonne permission :

$ chmod 710 ~/.esmtprc
Ensuite, répétez le test avec message.txt exactement comme avant.

Exemple avec opensmtpd

Installez opensmtpd.

Editez /etc/smtpd/smtpd.conf. La configuration suivante permet la livraison locale :

listen on localhost
action "local" mbox alias <aliases>
match for local action "local"

Vous pouvez procéder à un test. Tout d'abord démarrez smtpd.service. Puis faites :

$ echo test | sendmail user

Votre user peut consulter son courriel avec n'importe quel client mail capable de gérer le format mbox, ou simplement jeter un coup d'oeil au fichier /var/spool/mail/user. Si tout se passe comme prévu, activez opensmtpd pour les démarrages futurs.

Cette approche a l'avantage de ne pas envoyer de notifications cron locales à un serveur distant. L'inconvénient est que vous devez faire tourner un nouveau daemon.

Note
  • Au moment de l'écriture, le paquet Arch opensmtpd ne crée pas tous les répertoires nécessaires sous /var/spool/smtpd, mais le daemon vous en avertira en spécifiant les propriétaires et les permissions nécessaires. Créez-les simplement comme suggéré.
  • Même si la configuration suggérée n'accepte pas les connexions distantes, il est prudent d'ajouter une couche supplémentaire de sécurité en bloquant le port 25 avec iptables (Français) ou similaire.

Tâche cron longue

Supposons que ce programme soit invoqué par cron :

#!/bin/sh
echo "J'ai eu une erreur récupérable !"
sleep 1h

Voici ce qui se passe :

  1. Cron exécute le script.
  2. Dès que cron consulte une sortie, il lance votre MTA, et lui fournit les en-têtes. Il laisse le tube ouvert, parce que la tâche n'est pas terminé et qu'il peut y avoir d'autres sorties.
  3. Le MTA ouvre la connexion à postfix et laisse cette connexion ouverte pendant qu'il attend le reste du corps.
  4. Postfix ferme la connexion inactive après moins d'une heure et vous obtenez une erreur comme celle-ci :
    smtpmsg='421 … Error: timeout exceeded' errormsg='the server did not accept the mail'

Pour résoudre ce problème, vous pouvez utiliser la commande chronic ou sponge de moreutils. Extrait des pages de manuel respectives :

chronic(1)
chronic exécute une commande, et fait en sorte que sa sortie standard et son erreur standard ne soient affichées que si la commande échoue (sortie non nulle ou plantage). Si la commande réussit, toute sortie superflue sera cachée.
sponge(1)
sponge lit l'entrée standard et l'écrit dans le fichier spécifié. Contrairement à une redirection de l'interpréteur de commandes, sponge absorbe toute son entrée avant d'ouvrir le fichier de sortie... Si aucun fichier de sortie n'est spécifié, sponge sort sur stdout.

Chronic aussi met en mémoire tampon la sortie de la commande avant d'ouvrir sa sortie standard.

Exécution d'applications basées sur le serveur X.org

Cron ne s'exécute pas sous le serveur Xorg ; il ne peut donc pas connaître les variables d'environnement nécessaires pour pouvoir lancer une application serveur X.org ; il faudra donc les définir. On peut utiliser un programme comme xuserrun-gitAUR pour le faire :

17 02 * ... /usr/bin/xuserrun /usr/bin/xclock

Ou bien ils peuvent être définis manuellement (echo $DISPLAY donnera la valeur actuelle de DISPLAY) :

17 02 * ... env DISPLAY=:0 /usr/bin/xclock

Si vous exécutez notify-send pour les notifications de bureau dans cron, notify-send envoie des valeurs à dbus. Il doit donc dire à dbus de se connecter au bon bus. L'adresse peut être trouvée en examinant la variable d'environnement DBUS_SESSION_BUS_ADDRESS et en lui donnant la même valeur. Donc :

17 02 * ... env DBUS_SESSION_BUS_ADDRESS=votre-adresse notify-send 'Machin truc'

Si cela est fait par SSH, par exemple, la permission devra être donnée :

# xhost +si:localuser:$(whoami)

Traitement asynchrone des tâches

Si vous éteignez régulièrement votre ordinateur mais que vous ne voulez pas manquer les tâches, il existe quelques solutions.

Cronie

cronie est livré avec anacron inclus. Le fichier de configuration est /etc/anacrontab. Des informations sur le format peuvent être trouvées dans anacrontab(5). L'exécution de anacron -T testera la validité de /etc/anacrontab.

Dcron

dcronAUR prend en charge de base le traitement asynchrone des tâches. Il suffit de le mettre avec @hourly, @daily, @weekly ou @monthly avec un nom de tâche, comme ceci :

@hourly ID=meilleure_tache echo "Cette tâche est très utile."

Cronwhip

cronwhipAUR est un script pour exécuter automatiquement les tâches cron manquées ; il fonctionne avec l'ancienne implémentation cron par défaut, dcron. Consultez également le fil de discussion du forum anglais.

Fcron

Comme anacron, fcron suppose que l'ordinateur n'est pas toujours en marche et, contrairement à anacron, il peut programmer des événements à des intervalles plus courts qu'une journée, ce qui peut être utile pour les systèmes qui suspendent/hibernent régulièrement (comme un ordinateur portable). Comme cronwhip, fcron peut exécuter des tâches qui auraient dû être exécutées pendant le temps d'arrêt de l'ordinateur.

Assurer l'exclusivité

Si vous exécutez des tâches qui peuvent durer longtemps (par exemple, une sauvegarde peut soudainement durer longtemps, en raison de nombreux changements ou d'une connexion réseau particulièrement lente), flock (dans util-linux) peut garantir que la tâche cron ne démarrera pas une deuxième fois.

5,35 * * * * /usr/bin/flock -n /tmp/lock.backup /root/creation-backup.sh

Voir aussi

  • Admin's Choice - Crontab Quick Reference (en)
  • crontab.guru - éditeur en ligne pour les crontab
  • cron-notifyAUR est un service de notification compatible avec FreeDesktop.org qui demande périodiquement une confirmation avant d'exécuter une commande. Les commandes sont configurées dans un fichier de configuration personnalisé.