Prestashop logo, Visiter page d'accueil

Gérer les tâches planifiées (cronjobs)

-

Une tâche cron est une tâche planifiée. Les tâches planifiées sont gérées par un processus appelé cron. Le processus cron suit ce que l'on appelle un crontab (abrégé de la table cron). Il existe un crontab système et des crontabs distincts pour chaque utilisateur. Ces étapes vous apprendront comment ajouter des tâches planifiées à un crontab basé sur l'utilisateur.

Comment ajouter une tâche cron ?

Hosting_terminal.png

Accédez à l'onglet TERMINAL de l'environnement de votre choix. Vous y trouverez un lien pour ouvrir le terminal et les informations d'identification dont vous aurez besoin pour vous authentifier. Lorsque le terminal est ouvert, tapez cette commande suivie de la touche Entrée :

crontab -e -u webapp

Vous verrez maintenant l'éditeur nano qui a ouvert le crontab pour l'utilisateur actuellement connecté, en l'occurrence webapp. Le contenu de l'éditeur ressemblera à ceci :

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

Attention : Le texte ci-dessus est une explication par défaut du paquet cron.

Le texte dans l'éditeur vous donne déjà une explication de comment les choses fonctionnent, accompagnée d'un exemple :

0 5 * * 1 tar -zcf /var/backups/home.tgz /home/

Dans cet exemple, vous remarquerez les cinq premiers caractères séparés par un espace blanc (un seul espace ou une tabulation) : ceux-ci déterminent l'intervalle auquel la tâche sera exécutée, où un astérisque agit comme un joker. Les jours de la semaine vont de 0, le dimanche, à 6, le samedi. Les cinq champs de gauche à droite indiquent :

  • minutes
  • heures
  • jour du mois
  • mois
  • jour de la semaine

Cela signifierait que l'exemple ci-dessus sera exécuté à :

  • 0 minute
  • 5 heures
  • tous les jours du mois
  • tous les mois
  • le 1er jour de la semaine : lundi

En résumé : à 05h00 tous les lundis.

Juste après l'intervalle, vous pouvez voir la commande qui sera exécutée par le cron :

tar -zcf /var/backups/home.tgz /home/

Ajoutons maintenant notre propre tâche cron. Vous devrez prendre en compte quelques éléments :

  1. PS Platform utilise des variables d'environnement qui doivent être chargées en mémoire avant d'exécuter des tâches.
  2. Vous devrez vous assurer que vos tâches planifiées sont exécutées dans le bon répertoire.

Ces deux éléments peuvent être résolus en chaînant des commandes dans le fichier crontab en utilisant un double esperluette &&. La double esperluette exécutera la commande suivante uniquement si la première commande a réussi, c'est-à-dire si elle s'est terminée avec le code de sortie 0. Ainsi, pour nous assurer que nous avons les variables d'environnement chargées et que nous sommes dans le bon répertoire avant de commencer l'exécution, notre commande commencera ainsi :

. /.victhorious/conf/shell/envvars && cd /vol/site/current/ && #TODO: add actual command

Maintenant que nous avons les variables d'environnement chargées et que nous sommes dans notre dossier racine, nous pouvons compléter la commande avec ce que nous prévoyons d'exécuter. Disons que nous voulons planifier l'importation Craft CMS Feed Me avec cron.

Exécuter les commandes Feed Me en tant qu'arguments de la ligne de commande est la meilleure option, mais il y a deux commandes pour le faire avec succès :

  1. Mettez d'abord les nouvelles données dans la file d'attente.
  2. Traitez les données mises en file d'attente.

Nous devons donc chaîner deux commandes supplémentaires. Cette fois, nous utiliserons le point-virgule (;) pour le faire, ce qui donnera à notre commande cet aspect :

. /.victhorious/conf/shell/envvars && cd /vol/site/current/ && php craft feed-me/feeds/queue 1 --continue-on-error; php craft queue/run

 

Conseil :
Contrairement à la double esperluette, le point-virgule garantira que toutes les commandes sont exécutées indépendamment de leur code de sortie !

 

Maintenant, nous devons toujours construire notre partie intervalle de temps. Disons que nous voulons exécuter cette importation toutes les 15 minutes, alors nous aurions cette ligne de crontab :

*/15 * * * * . /.victhorious/conf/shell/envvars && cd /vol/site/current/ && php craft feed-me/feeds/queue 1 --continue-on-error; php craft queue/run

Le */15 pourrait être lu comme 'toutes les minutes qui peuvent être divisées par le nombre 15', qui sont :

  • minute 0
  • minute 15
  • minute 30
  • minute 45

En résumé : toutes les 15 minutes.

Conseil :
Si vous avez du mal à construire la syntaxe temporelle correcte pour un intervalle souhaité, vous pouvez utiliser crontab guru pour vous aider.

 

Comme la plupart des commandes produisent généralement une sortie, nous voudrons supprimer cette sortie pour éviter que des déchets inutiles s'accumulent sous forme d'alertes utilisateur concernant les tâches cron.

La façon de faire cela est de rediriger la sortie standard et l'erreur standard vers /dev/null comme ceci :

*/15 * * * * . /.victhorious/conf/shell/envvars && cd /vol/site/current/ && php craft feed-me/feeds/queue 1 --continue-on-error > /dev/null 2>&1; php craft queue/run > /dev/null 2>&1

Conseil :
L'ajout de > /dev/null 2>&1 derrière chaque commande enverra la sortie vers /dev/null, tandis que 2>&1 redirigera également stderr vers stdout, le faisant ainsi se retrouver également dans /dev/null. Si vous remplacez > /dev/null par >> /vol/site/cron.log, vous pourrez consigner la sortie dans le fichier /vol/site/cron.log sur le disque.

 

Attention :
Le caractère pourcentage (%) a un sens spécial dans la syntaxe crontab. Nous n'allons pas entrer dans les détails ici, mais sachez que le signe % doit être échappé si vous voulez l'utiliser. Donc, si vous voulez consigner une date formatée à chaque exécution de cron, vous devriez faire quelque chose comme date +\%D-\%T.

Enregistrez maintenant les modifications du crontab en appuyant sur CTRL+X, suivi de la saisie de Y et en appuyant sur Entrée.

Vous pouvez tester votre cron avec :

Crontab.guru - The cron schedule expression editor

 

Exemples de cron avec appel d'URL PrestaShop avec curl

crontab -e -u webapp
00 01 * * * curl -L -s -o /dev/null "<https://mysite.fr/modules/gsitemap/gsitemap-cron.php?token=XXXXXXXXX&id_shop=1>"
00 02 * * * curl -L -s -o /dev/null "<https://mysite.fr/admin/index.php?controller=AdminSearch&action=searchCron&ajax=1&full=1&token=XXXXXXXXX&id_shop=1>"

De même que :

00 01 * * * wget -q -O /dev/null "<https://mysite.fr/modules/gsitemap/gsitemap-cron.php?token=XXXXXXXXX&id_shop=1>"
00 02 * * * wget -q -O /dev/null "<https://mysite.fr/admin/index.php?controller=AdminSearch&action=searchCron&ajax=1&full=1&token=XXXXXXXX&id_shop=1>"

 

Voir les tâches planifiées installées

Pour visualiser rapidement la liste des tâches planifiées, vous pouvez simplement entrer :

#root
crontab -l

#webapp
crontab -l -u webapp

Cette commande affichera le fichier crontab pour votre utilisateur à l'écran.

Partager

L'article vous a-t-il été utile ?