Bonsoir la compagnie,
Après avoir fait joujou une première fois avec les tâches planifiées sous cron gnu/linux, je vous avais promis de vous en dire plus sur les procédés et les possibilités du système de planification des tâches de GNU/Linux : cron.
Résumé de ce que vous savez déjà faire si vous avez lu la première partie sur les tâches planifiées cron :
- Créer une tâche planifiée simple qui lance un fichier exécutable avec l’utilisateur courant (celui qui a créé le cron) à l’aide la commande crontab
- Faire des tâches planifiées à exécution unique (planification non régulière/récurrente)
- (Utiliser un autre éditeur pour la commande crontab -e)
Ce que je vais vous apprendre en plus dans cet article :
- Gérer des dates complexes : Répétitions, récurrence des tâches planifiées (jokers, répétitions, sélections multiples)
- Définition d’un fichier personnalisé de tâches planifiées
- Définir une tâche exécutée par un utilisateur précis.
- Éxécuter une tâche planifiée dans un répertoire particulier.
- Éxécuter une tâche planifiée graphique.
- Gérer les sorties des commandes exécutées par CRON : logs, mails, etc.
Je vous donnerai également quelques filons pour l’utilisation de PHP avec CRON.
Retour sur la planification des tâches : la syntaxe des dates avancées avec CRON.
Je ne refais pas les explications sur les dates simples dans CRON, c’est le sujet de la première approche (dont vous avez les liens au début de cet article). Nous allons voir comment créer une tâche récurrente, à l’aide des jokers, répétitions et sélections multiples.
Le joker : *
Comme dans beaucoup d’applications informatique, le joker chez Cron est l’étoile « * ». Ainsi, si vous remplacez un quelconque paramètre d’une date par une étoile, cela signifie pour cron « quelque-soit la valeur de ce paramètre ».
Exemple : Quelque-soit le jour, je veux que à 7h05 tu dises bonjour, durant tout le mois de février :
05 07 * 02 * echo 'Hello World !'
Ici nous avons remplacé le numéro du jour dans le mois, ainsi que le jour de la semaine (qui est également susceptible de varier !) par le joker « * », ainsi, quelque-soit les valeurs de ces paramètres, si les autres paramètres (heure, minute, mois) sont vérifiés, CRON dira bonjour au monde.
La répétition : /
Le joker permet de spécifier, au maximum, une répétition toutes les unités de temps d’un paramètre précis. En effet, si je mets un joker pour l’heure, alors cela sera exécuté toutes les une heure, puisque cela sera « quelque-soit l’heure ». Ainsi, avec les jokers, vous pouvez répéter au mieux : tous les jours, toutes les heures, toutes les minutes, tous les lundis, tous les mois… Bref, pas terrible comme flexibilité tout de même. C’est à cela que sert la répétition, elle vous permet de dire tous les combien de variation d’un paramètre vous voulez que cela se répète. Une variation d’un paramètre, c’est +1 minutes, +1 heure, +1 jour, etc. …
L’opérateur de répétition s’utilise comme suit : valeur_param/intervalle_de_repetition
Ainsi, si je veux que toutes les 15 minutes, une action se répète, quelque-soit la date :
*/15 * * * * /usr/bin/monaction
On utilise ici également le joker, puisque l’action se répète quelque-soit la minute, l’heure, ou la date…
Les intervalles et les sélections multiples
Vous pouvez également définir plusieurs valeurs d’un paramètre pour lesquelles la tâche sera exécutée. On procède soit en donnant un intervalle de valeurs, soit une liste de valeurs.
Opérateur d’intervalle : -
Utilisation : borne1-borne2 ou borne1 et borne2 sont les bornes de l’intervalle ( [borne1 ; borne2] ) et incluses.
Exemple : La précédente action se répète toutes les 15 minutes, du 1er au 10 du mois
*/15 * 1-10 * * /usr/bin/monaction
Opérateur de valeurs multiples : ,
Utilisation : valeur1, valeur2, valeur3…
Exemple : La précédente action se répète toutes les 15 minutes mais seulement entre 02h et 03h puis entre 05h et 06h
*/15 2,5 * * * /usr/bin/monaction
Définir une fichier cron personnalisé : Cron en mode admin
Jusqu’à présent, vous avez utilisé la commande crontab afin de modifier votre fichier cron et d’ajouter ou de supprimer des tâches.
En réalité vous n’avez utilisé que le côté « utilisateur » de cron. La suite n’est ouverte qu’à un accès root, autrement dit l’administateur de la machine, car elle permet notamment de décider de sous quel utilisateur vont être exécutées les tâches, ce que nous verrons en même temps.
Si ce mode d’utilisation de cron n’est réservé qu’à l’administateur, c’est pour plusieurs raisons :
- Il va permettre, comme je l’ai dit, de choisir l’utilisateur qui exécute la commande
- Le répertoire dans lequel nous allons créer le fichier appartient à root
- Seul root peut demander à cron de recharger les fichiers de configuration, or nous en aurons besoin car comme nous allons éditer de simples fichiers, la commande crontab ne sera pas là pour, à la fin de l’édition du fichier, dire à cron « Hey hey, ouhou, on a modifié le fichier là, viens y jeter un coup d’oeil » et par défaut cron ne verra donc pas vos modifs sans reload, et donc sans droits d’admin.
Créer votre fichier de tâches planifiées : le répertoire /etc/cron.d/
Vous êtes donc maintenant loggé en root, ou, si vous n’avez pas le su sur votre machine, vous exécuterez le reste des commandes avec un « sudo » devant.
Les fichiers de tâches planifiées sont placés dans le répertoire /etc/cron.d/, qui appartient à root.
Créons-y un fichier :
vim /etc/cron.d/monfichiercron
Voilà, tout le travail est fait… ou presque. Dans ce fichier, vous pouvez placer des tâches planifiées exactement de la même façon qu’avec la commande crontab à la différence prêt… qu’il faut spécifier l’utilisateur d’exécution !
Cela donne :
mm HH JJ MM joursemaine utilisateur /chemin/commande
Exemple, je suis l’utilisateur Troll, je veux que l’utilisateur Toto fasse le ménage dans son dossier personnel chaque semaine (vision geek du Range ta chambre ! maternel/paternel), on dira qu’on est un peu radical, si le dimanche il n’a pas vidé son dossier perso (il est censé le faire le samedi) tant pis : tout poubelle !
Note : A NE PAS TESTER CHEZ VOUS ! Vous risqueriez d’avoir de sérieux ennui ^^
01 00 * * sun toto rm -fR /home/toto/*
Bien sûr l’utilisateur peut aussi être root… But, be careful !
Ensuite, une fois que vous avez sauvegardé votre fichier, il faut dire à cron de le relire pour l’intégrer :
(encore une commande à faire en root, si vous avez bien lu le début de ce paragraphe !)
/etc/init.d/crond reload
Cron a bien rechargé s’il dit ça normalement :
Reloading crond: [ OK ]
Les autres fichiers préconfigurés de cron :
Cron a également des dossiers préconfigurés, dans lesquels il vous suffit de mettre un script (ou un lien symbolique, solution la plus souvent utilisée) exécutable.
Ces dossiers sont les suivants :
- /etc/crond.daily : exécution quotidienne (chaque jour à 4h02)
- /etc/crond.hourly : exécution chaque heure (chaque heure + 1 minute)
- /etc/crond.weekly : exécution hebdomadaire (le dimanche à 4h22)
- /etc/crond.monthly : exécution mensuelle (le 1er du mois à 4h42)
Comme je suis gentil, je vous donne même les commandes :
Création d’un script exécutable dans un dossier :
(en root encore et toujours)
vim /mon/chemin/de/fichier && chmod +x /mon/chemin/de/fichier
Création d’un lien symbolique dans /etc/crond.daily (par exemple) pointant vers /mon/chemin/de/fichier :
ln -s /mon/chemin/de/fichier /etc/crond.daily/monscript && chmod +x /etc/crond.daily/monscript
L’avantage du lien symbolique c’est que vous pouvez mettre votre script dans un dossier où vous le retrouvez et vous pouvez placer un lien dans plusieurs dossiers /etc/crond.XXX/ sans avoir à modifier tous les fichiers quand vous modifiez le script (principe du lien symbolique).
Éxécuter des tâches planifiées dans un répertoire particlier
Il peut s’avérer que vous ayiez besoin d’exécuter une commande qui va chercher des fichiers ou autres dans son répertoire courant et qui sera donc perdue si vous la lancez avec cron de la manière /chemin/commande
Pour cela, utilisez tout simplement la commande cd :
03 01 * * * tutu cd /home/tutu/scripts/ && ./macommande
Éxécution d’une tâche planifiée graphique
La console, y’a rien de mieux, ça plante pas, ça vous cache rien… Mais c’est pas très esthétique. Puis si vous voulez par exemple lancer Amarok pour vous reveiller en musique, Amarok va avoir besoin d’une interface graphique (sauf si vous connaissez une interface ligne de commande pour amarok, auquel cas je veux bien que vous partagiez l’info avec moi !).
Pour cela, procédez comme suit : placez DISPLAY=:0 après le jour de la semaine, ou après le nom d’utilisateur quand celui-ci est spécifié.
Si vous utilisez une commande composée, du type :
/chemin/premierecommande && /chemin/deuxiemecommande
(ce qui est notamment le cas lorsque vous exécutez dans un répertoire particulier) alors vous devez mettre le DISPLAY=:0 juste avant la commande qui aura besoin de l’affichage.
Gérer les sorties des commandes exécutées par CRON : logs, mails, etc.
Par défaut, notamment lors de la définition d’une tâche planifiée avec crontab -e, si votre commande génère une sortie vous devez – en théorie (désactivé sur certaines distrib’) – recevoir un « mail » ( dans /var/spool/votrelogin ) avec la sortie générée.
Ce n’est pas vraiment un mode très pratique pour logger et retrouver les sorties de vos tâches planifiées préférées.
Je vais donc vous montrer comment enregistrer dans un fichier log la sortie de vos tâches planifiées.
En fait, cela revient au même que pour enregistrer dans un fichier log une commande console standard. Cela revient à faire comme ceci :
Enregistrer tout dans monfichier.log (sortie normale + erreurs)
/chemin/macomandequigenereunesortie > monfichier.log 2>&1
Enregistrer seulement les erreurs dans monfichier.log :
/chemin/macomandequigenereunesortie > /dev/null 2> monfichier.log
Ne rien enregistrer :
/chemin/macomandequigenereunesortie > /dev/null 2>&1
Attention, tel que c’est présenté ici, chaque nouvelle exécution remplace le contenu de monfichier.log
Si vous voulez logger sur plus d’un seul lancement, vous devez créer le fichier monfichier.log avant (ce qui n’était pas nécessaire précédemment) et remplacer systématiquement dans les précédentes commandes, le « > » par « >> » (enfin presque, pas tous, regardez ci-dessous).
Ce qui donne :
/chemin/macomandequigenereunesortie >> monfichier.log 2>&1
/chemin/macomandequigenereunesortie > /dev/null 2>> monfichier.log
/chemin/macomandequigenereunesortie > /dev/null 2>&1
Annexes : Utilisation de PHP avec CRON
Pour lancer une tâche écrite en PHP avec cron, saisissez une tâche de la manière suivante :
mm HH JJ MM joursemaine [user] /usr/bin/php -f /chemin/de/fichier.php
Ou, ce qui est conseillé avec PHP, avec exécution dans un repértoire particulier :
mm HH JJ MM joursemaine [user] cd /chemin/de/ && /usr/bin/php -f ./fichier.php
Bien évidemment, vous pouvez logger dans un .log avec les .php comme avec n’importe quelle autre commande.
Voilà, c’est terminé : des remarques, des erreurs à signaler, des questions -> Les commentaires sont là pour ça ! J’espère avoir été clair et que cet article sera utile au plus grand nombre