Tâches planifiées cron
L'outil tâches cron permet l'ajout de tâches planifiées sur votre hébergement de site internet. Une tâche planifiée permet d’exécuter automatiquement une commande (ou un script) à une date et une heure spécifiées à l'avance ou selon un cycle défini (toutes les heures, toutes les semaines etc…).
Icône | Nom | Catégorie | Description |
---|---|---|---|
Tâches cron | Avancé | Permet l'ajout de tâches planifiées sur votre hébergement |
Comment ajouter une tache cron ?
Dans cPanel, l'ajout d'une tache cron se fait facilement. Dans un premier temps, il faut sélectionner une périodicité dans le premier formulaire. Des options pré-configurées sont disponibles, n'hésitez pas à les utiliser. En utilisant les options pré-configurées (paramètres communs), les différentes cases pour “minute, heure, jour, mois, jour” sont remplies automatiquement.
Sélection de la périodicité des tâches cron
Ensuite, il faut définir la commande à exécuter. Plusieurs variantes sont possibles et il y a également plusieurs pièges courants. Voici les formats de commandes les plus courants :
- wget -qO /dev/null 'http://mon-site.fr/dossier/cron.php?param1=valeur¶m2=valeur'
- Il ne faut pas oublier la partie
-o /dev/null
sinon un fichier va se générer à la racine de votre hébergement à chaque exécution de la tâche. - Il faut bien placer l'adresse web entre double guillemet, c'est très important et d'autant plus si vous faites un passage de paramètres dans l'adresse comme
?param1=valeur¶m2=valeur
.
php /home/monUtilisateur/public_html/dossier/cron.php
- Il faut faire attention au chemin, il doit être absolu. Si besoin, vous pouvez le récupérer dans le gestionnaire de fichier de cPanel ou bien remplacer par une commande similaire comme
php -q ~/public_html/dossier/cron.php
. Le~
représente la racine de votre hébergement. - Il ne faut pas oublier l'option
-q
pourquiet
(ne rien renvoyer)
/home/monUtilisateur/monscript.sh
- Le fichier doit être en
chmod 755
- Le script doit contenir un shebang
- Le chemin doit être valide
Au final, vous devez avoir quelque chose de similaire à ceci :
Configuration finale d'une tâche cron
Cas particuliers
Si vous utilisez une Cron en PHP et que celle-ci ne s'exécute pas correctement, vous pouvez remplacer “php” par le binaire de PHP en fonction de la version que vous avez défini dans Sélectionner une version de PHP sur votre cPanel.
Par exemple si on reprend le cas précédent : php /home/monUtilisateur/public_html/dossier/cron.php
On le remplace par /opt/alt/php80/usr/bin/php /home/monUtilisateur/public_html/dossier/cron.php
si vous utilisez PHP 8.0.
Exemples de binaires :
/opt/alt/php56/usr/bin/php /opt/alt/php70/usr/bin/php /opt/alt/php71/usr/bin/php /opt/alt/php72/usr/bin/php /opt/alt/php73/usr/bin/php /opt/alt/php74/usr/bin/php /opt/alt/php80/usr/bin/php /opt/alt/php81/usr/bin/php /opt/alt/php82/usr/bin/php
Crons via Symfony
Si vous souhaitez mettre en place des Crons en utilisant Symfony nous expliquons le fonctionnement et la syntaxe à utiliser sur Hébergement d'une application Symfony chez o2switch
Retour par email
Dans les tâches cron, il est possible de configurer un retour par email. Pour faire cela, il suffit d'indiquer l'adresse email dans le champ prévu à cet effet dans l'outil.
Définition de l'adresse email d'alerte pour les tâches cron
Plusieurs détails concernant cette alerte email :
- un email est généré uniquement si le script affiche quelque chose sur sa sortie standard.
- cela veut dire que la non réception d'un email n'est pas forcément signe que la tâche cron ne s'exécute pas, ça veut simplement dire que le script se lance mais s'exécute en silence, sans rien afficher
- il est possible d'ajouter
>/dev/null 2>&1
à la fin de certaines tâches cron pour rediriger la sortie d'affichage vers la poubelle, ce qui évite l'envoi d'un email
Éviter qu'une commande se lance plusieurs fois
Lorsque vous travaillez avec des tâches cron, il est possible d'être confronté au problème des processus qui s'accumulent / se lancent en parallèles et saturent l'hébergement.
Par exemple, si vous mettez en place une tâche cron qui s'exécute toutes les minutes sur votre hébergement, si cette tâche planifiée prend plus d'une minute à s'exécuter, cela va engendrer la création d'une infinité de processus, jusqu'à saturation de votre hébergement. Car la commande à M+2 sera lancée alors que M+1 n'est pas encore terminé.
La saturation arrive assez rapidement par effet boule de neige : plus vous avez de processus, plus ils consomment/se partagent les ressources, donc plus ils prennent de temps avant de se terminer et la saturation s'accentue, jusqu'à atteindre une des limites de l'hébergement : le CPU, la mémoire ou le nombre de processus qu'il est possible de lancer simultanément.
Il est possible d'éviter cela en utilisant flock
. Cette commande permet de s'assurer qu'un processus ne se lance qu'une seule fois, avec un mécanisme de verrouillage (lock).
Un autre usage de flock
dans le contexte des tâches cron est de s'assurer qu'un processus reste actif en permanence sur votre hébergement.
Par exemple, vous avez un processus qui traite des tâches aynchrones sur votre hébergement. Vous avez besoin que ce processus reste en plac et soit relancée régulièrement lorsqu'il s'interrompt ou est tué. Vous pouvez mettre en place cela en créant une tâche planifiée qui s'exécute toutes les minutes, couplé à flock
pour s'assurer qu'il n'y qu'un seul processus en permanence (sinon l'outil de cron lancera un processus toutes les minutes jusqu'à saturation). Si le processus meurt, il sera relancé au plus tard une minute plus tard par les tâches cron.
La commande flock
peut être utilisé de la manière suivante :
# Exemple générique flock -n /home/votreUtilisateurcPanel/.cron.lock votrecommande --avec --les --options # Exemple avec le composant messenger de Symfony # Le --time-limit=3600 est conservé, suivant les recommandations de Symfony # Messenger doit être relancé de temps en temps pour éviter les fuites mémoires flock -n /home/demo/.messenger-cron.lock php /home/demo/projet_symfony/bin/console messenger:consume --time-limit=3600 --memory-limit=128M async > /home/demo/log-messenger.txt 2>&1
Avec flock
:
- lorsque la commande est lancée la première fois, un fichier de verrou est créé (
/home/votreUtilisateurcPanel/.cron.lock
dans l'exemple) - tant que la commande est en cours d'exécution, le fichier de verrou n'est pas acquérable
- donc lorsque la commande est lancée la seconde fois, flock regarde s'il est possible d'acquérir le verrou. Si ce n'est pas possible (si la commande est en cours d'exécution), alors flock ne fait rien
- dés que le processus meurt ou se termine normalement, il est à nouveau possible d'acquérir le verrou et donc la commande se relance
- ça permet de garantir qu'il n'y aura qu'une seul processus en cours d'exécution, même si la commande est lancée plusieurs fois d'affilée
Si vous avez plusieurs commandes différentes à lancer avec flock
pensez à indiquer un fichier de verrou différents pour chaque commande. Sinon ça ne lancera qu'une des commandes.
flock -n /home/demo/.commande1.lock ma-commande-1 flock -n /home/demo/.commande2.lock ma-commande-2