cron (Français)

É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.
Related articles
systemd/Timers
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 :
cronie
fcron
dcron
AUR
scron-git
AUR
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
.
Éditez
l'unité
cronie.service
.
Installez
esmtp
AUR
,
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
ssmtp
AUR
, 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
esmtp
AUR
et
procmail
AUR
.
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 :
Cron exécute le script.
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.
Le MTA ouvre la connexion à postfix et laisse cette connexion ouverte pendant qu'il attend le reste du corps.
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-git
AUR
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
dcron
AUR
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
cronwhip
AUR
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-notify
AUR
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é.