Cron (Français)

From ArchWiki
État de la traduction: Cet article est la version francophone de Cron. Date de la dernière traduction: 2022-01-10. 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 systemd (Français)/Timers (Français) à la place. Consultez le guide de cron de Gentoo, qui propose des comparaisons.

Paquets disponibles :

Lancement

Vu qu'il s'agit d'un service, avant de pouvoir utiliser cron il faut le démarrer:

systemctl start cronie

et pour un démarrage automatique:

systemctl enable cronie

Configuration

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: cronie fournit une tâche hourly (horaire) avec 0anacron qui permet le l'exécution retardée d'autres tâches, par exemple si l'ordinateur était éteint au moment de l'exécution standard.

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 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 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.

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 modifier 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 procmail.

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. Depuis leur page de manuel respective :

chronic
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
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.

Format de la crontab

Le format de base d'une crontab est :

minute heure jour_du_mois mois jour_de_la_semaine commande
  • Les valeurs de minute peuvent être comprises entre 0 et 59.
  • Les valeurs des heures peuvent être comprises entre 0 et 23.
  • Les valeurs de jour_du_mois peuvent aller de 1 à 31.
  • Les valeurs de mois peuvent aller de 1 à 12.
  • Les valeurs de jour_de_la_semaine peuvent aller de 0 à 6, avec 0 pour le dimanche.

Les espaces sont utilisés pour séparer les champs. 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 d'été (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.

Pour en savoir plus, consultez : https://www.adminschoice.com/crontab-quick-reference

Vous trouverez ci-dessous d'autres exemples et des techniques de configuration avancées.

Commandes de base

Les crontabs ne doivent jamais être modifiés directement ; les utilisateurs doivent plutôt utiliser le programme crontab pour travailler avec leurs crontabs. Pour avoir accès à cette commande, l'utilisateur doit être membre du groupe users (consultez la commande gpasswd).

Pour visualiser leurs crontabs, les utilisateurs doivent lancer la commande :

$ crontab -l

Pour modifier leurs crontabs, ils peuvent utiliser :

$ crontab -e
Note: Par défaut, la commande crontab utilise l'éditeur vi. Pour le changer, exportez EDITOR ou VISUAL, ou spécifiez directement l'éditeur : EDITOR=vim crontab -e.

Pour supprimer leurs crontabs, ils doivent utiliser :

$ crontab -r

Si un utilisateur possède une crontab enregistrée et qu'il souhaite écraser complètement son ancienne crontab, il doit utiliser :

$ 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, lancez la commande suivante en tant que root :

# 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.

Exemples

L'entrée :

01 * * * * /bin/echo Hello, world !

exécute la commande /bin/echo Hello, world! à 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 Hello, world !

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 (comme indiqué dans crontab(5)) :

*0,*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).

Les paramètres périodiques peuvent également être saisis comme dans ce modèle crontab :

# Chronological table of program loadings                                       
# Edit with "crontab" for proper functionality, "man 5 crontab" for formatting
# User: johndoe

# mm  hh  DD  MM  W /path/progam [--option]...  ( W = weekday: 0-6 [Sun=0] )
  21  01  *   *   * /usr/bin/systemctl hibernate
  @weekly           $HOME/.local/bin/trash-empty

Voici quelques exemples explicites de syntaxe crontab :

30 4 echo "It is now 4:30 am."
0 22 echo "It is now 10 pm."
30 15 25 12 echo "It is 3:30pm on Christmas Day."
30 3 * * * echo "Remind me that it's 3:30am every day."
0 * * * * echo "It is the start of a new hour."
0 6 1,15 * * echo "At 6am on the 1st and 15th of every month."
0 6 * * 2,3,5 echo "At 6am on Tuesday, Wednesday and Thursdays."
59 23 * * 1-5 echo "Just before midnight on weekdays."
0 */2 * * * echo "Every two hours."
0 20 * * 4 echo "8pm on a Thursday."
0 20 * * Thu echo "8pm on a Thursday."
*/15 9-17 * * 2-5 echo "Every 15 minutes from 9am-5pm on weekdays."
@yearly echo "Happy New Year!"

É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")"

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

Cron ne s'exécute pas sous le serveur X.org ; 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 travaux, il existe quelques solutions (de la plus simple à la plus difficile) :

Cronie

cronie est livré avec anacron inclus. La page d'accueil du projet dit :

Cronie contient le daemon UNIX standard crond qui exécute des programmes spécifiés à des heures programmées et les outils associés. Il est basé sur le cron original et possède des améliorations de sécurité et de configuration comme la possibilité d'utiliser pam et SELinux.

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 Cete 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 [1].

Anacron

Anacron est un remplacement complet de dcron qui traite les tâches de manière asynchrone.

Il est fourni par cronie. 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.

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.

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 [2].

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 (util-linux) peut garantir que la tâche cron ne démarrera pas une deuxième fois. (util-linux) peut garantir que la tâche cron ne démarrera pas une seconde fois.

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

Cronie

La hiérarchie des fichiers pertinents pour cronie est la suivante :

   /etc/
     |----- cron.d/
              | ----- 0hourly
     |----- cron.minutely/
     |----- cron.hourly/
              | ----- 0anacron
     |----- anacrontab
     |----- cron.daily/
     |----- cron.monthly/
     |----- cron.weekly/
     |----- crontab
     |----- cron.deny

Cronie fournit à la fois les fonctionnalités cron et anacron : cron exécute des tâches à intervalles réguliers (jusqu'à une granularité d'une minute) tant que le système est disponible à l'heure spécifiée, tandis que anacron exécute des commandes à des intervalles spécifiés en jours. Contrairement à cron, il ne suppose pas que le système fonctionne en permanence. Chaque fois que le système est en marche, anacron vérifie s'il y a des travaux qui auraient dû être exécutés et les traite en conséquence.

Une tâche cron peut être définie dans un fichier de type crontab dans le répertoire /etc/cron.d ou ajoutée dans le fichier /etc/crontab. Notez que ce dernier n'est pas présent par défaut mais est utilisé s'il existe. Selon les instructions de /etc/cron.d/0hourly, tout fichier exécutable dans /etc/cron.hourly sera lancé toutes les heures (par défaut à la minute 1 de l'heure). Les fichiers dans /etc/cron.minutely sont exécutés toutes les minutes si cela est indiqué dans /etc/cron.d/0hourly. Les exécutables sont généralement des scripts shell, des liens symboliques vers des fichiers exécutables peuvent également être utilisés. 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.

Anacron fonctionne de manière similaire, en exécutant les fichiers des répertoires /etc/cron.daily, /etc/cron.weekly et /etc/cron.monthly, placés là en fonction de la fréquence de travail souhaitée. Le travail cron /etc/cron.hourly/0anacron s'assure que anacron est lancé une fois par jour pour effectuer ses tâches en attente.

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 ignoré puisque cronie n'en a pas besoin.
  • Cronie est particulier 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

Le daemon cron analyse un fichier de configuration appelé crontab. 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).

/var/spool/cron/root
# Exécuter la commande à un moment programmé
# Modifier avec 'crontab -e' pour vérifier les erreurs, man 1 crontab pour un format acceptable.

# <@freq> <balises et commande>
@hourly ID=sys-hourly /usr/sbin/run-cron /etc/cron.hourly
@daily ID=sys-daily /usr/sbin/run-cron /etc/cron.daily
@weekly ID=sys-weekly /usr/sbin/run-cron /etc/cron.weekly
@monthly ID=sys-monthly /usr/sbin/run-cron /etc/cron.monthly

# mm hh DD MM W /path/command (ou tags) # W = semaine : 0-6, Sun=0
  21 01 * * * /usr/bin/systemctl suspend

Ces lignes illustrent l'un des formats que peuvent avoir les entrées crontab, à savoir des champs séparés par des espaces blancs spécifiant :

  1. @period
  2. ID=jobname (cette balise est spécifique à dcron)
  3. commande

L'autre format standard pour les entrées crontab est :

  1. minute
  2. heure
  3. jour
  4. mois
  5. Jour de la semaine
  6. commande

Les fichiers crontab eux-mêmes sont généralement stockés dans /var/spool/cron/username. Par exemple, le crontab de root se trouve dans /var/spool/cron/root.

Consultez la page de manuel de crontab pour plus d'informations et des exemples de configuration.

Voir aussi