Cron (Français)
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 :
- cronie
- fcron
- dcronAUR
- vixie-cronAUR
- scron-gitAUR
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.
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é.
-
Éditez l'unité
cronie.service
. - 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 :
[email protected]
ou créez /etc/msmtprc
et ajoutez cette ligne :
alias /etc/aliases
et créez /etc/aliases
:
your_username: [email protected] # Optional: default: [email protected]
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 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"
~/.esmtprc
avec le même contenu.
Exécutez la commande suivante pour vous assurer qu'elle dispose de la bonne permission :
$ chmod 710 ~/.esmtprcEnsuite, 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.
- 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. 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
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.
- 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 (.) carrun-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 queCAN'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.
>/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>&1Vous 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 :
- @period
- ID=jobname (cette balise est spécifique à dcron)
- commande
L'autre format standard pour les entrées crontab est :
- minute
- heure
- jour
- mois
- Jour de la semaine
- 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
- Guide du Cron de Gentoo Linux
- crontab.guru - éditeur en ligne pour les expressions de cronjob.