Cron
Le processus Moodle cron est un script PHP, partie intégrante de la distribution standard de Moodle, qui doit être lancé régulièrement. Ce script lance diverses tâches programmées à différents intervalles.
IMPORTANT ! Ne sautez pas l'étape de configuration du processus cron sur le serveur hébergeant votre installation de Moodle. Votre site ne fonctionnera pas correctement sans lui !
Il est recommandé de lancer le cron à une fréquence d'une fois par minute, comme cela est requis pour la suppression synchrone des activités lors de l'utilisation de la corbeille.
Le programme cron (qui lance le script cron de Moodle) fait partie de façon standard des systèmes Unix (y compris Linux et macOS) et est utilisé pour lancer toutes sortes de services dépendant de l'heure. Sous Windows, la solution la plus simple pour répliquer ce comportement est de créer une tâche dans le Gestionnaire des tâches Windows et de la faire lancer à intervalles réguliers. Sur les serveurs mutualisés, il vous faudra trouver la documentation (ou demander de l'assistance) sur la façon de configurer le cron. La plupart des serveurs mutualisés offrent CPanel pour gérer les sites, et auront donc une section pour configurer les tâches Cron sur le panneau de configuration.
Normalement, pour configurer le cron, il s'agit d'ajouter une unique commande à la liste des activités du cron déjà existantes sur votre système. Sur les systèmes Unix, cette liste est contenue dans le fichier dénommé crontab, propre à chaque utilisateur.
Discussion générale
Ce paragraphe détaille diverses informations de base. Voyez plus loin pour des instructions propres à votre type de serveur.
Deux étapes sont essentielles pour faire fonctionner le cron :
- identifier la commande correcte à lancer, et
- trouver le bon endroit où indiquer cette commande sur votre système.
Comprendre le script cron de Moodle
Moodle a deux façons différentes de déployer le cron, qui utilisent deux scripts différents de l'installation de Moodle.
- Le script CLI (command line interpreter = interface en ligne de commande). Ce script se trouve ici :
/chemin/de/moodle/admin/cli/cron.php
Si vous ne savez pas que faire, c'est ce script que vous devez utiliser. Il nécessite d'être lancé sur votre serveur par PHP en ligne de commande. La commande à lancer ressemblera donc à quelque chose comme/usr/bin/php /chemin/de/moodle/admin/cli/cron.php
Vous pouvez (et devez) tester cette commande à la main pour voir si elle fonctionne. Attention ! Vérifiez que la version de PHP en ligne de commande est compatible avec votre version de Moodle. Le programme PHP en ligne de commande est différent de celui utilisé par le serveur web et n'est pas toujours à la même version. - Si pour une raison ou une autre vous ne pouvez pas lancer le script CLI, vous pouvez utiliser le script web. Ce script est lancé depuis un navigateur web en chargeant une URL qui ressemble à celle-ci : http://mon.site-moodle.fr/admin/cron.php. On peut utiliser pour cela un navigateur web en ligne de commande (par exemple wget), et la commande à lancer ressemblera donc à quelque chose comme
/usr/bin/wget http://mon.site-moodle.fr/admin/cron.php
Cette méthode a l'avantage de pouvoir être lacée *depuis n'importe où*. Si vous n'arrivez pas à configurer le cron sur votre serveur, vous pouvez ainsi le lancer depuis une autre machine.
Trouver l'emplacement où indiquer la commande
Cette étape dépend du serveur que vous utilisez. Il vous faut donc lire la documentation de votre plateforme ou de votre hébergeur. La plupart du temps, mettre en place le cron de Moodle consiste à déterminer la bonne commande à lancer (voir ci-dessus) et à l'ajouter, avec l'horaire adéquat, à un fichier prévu pour cela, soit en le modifiant directement, soit via une interface spécifique.
Si vous utilisez le script CLI, vous devez également vous assurer que le processus cron est lancé avec le bon utilisateur. Il n'est en revanche pas nécessaire de s'en soucier avec la version web.
Exemple : installation du cron sur Linux Ubuntu/Debian. On suppose que l'utilisateur est connecté en tant que root.
Utiliser la commande crontab pour ouvrir la fenêtre de l'éditeur de crontab pour l'utilisateur www-data. Il s'agit de l'utilisateur qui possède le processus Apache (le serveur web) sur les serveurs Debian
$ crontab -u www-data -e
Cette commande ouvre la fenêtre de l'éditeur. Pour configurer le script cron de sorte à le lancer toutes les minutes, ajouter la ligne :
*/1 * * * * /usr/bin/php /chemin/de/moodle/admin/cli/cron.php >/dev/null
Remarque : la fin de la commande >/dev/null envoie à la poubelle la sortie de la commande et évite que vous receviez un courriel toutes les minutes.
Mettre en place le cron sur votre système
Suivant le type de votre serveur :
- Cron sur Unix ou Linux - Services cron sur les systèmes d'exploitation Unix et Linux.
- Cron sur Apple OS X - Utilisez le service crontab comme dans Cron sur Unix ou Linux. Il est cependant aussi possible d'effectuer ceci à la façon OS X, à l'aide de launchd. Pour cela voir Cron sur Mac OS X.
- Cron sous Windows - Services cron sous Windows
- Cron avec des services d'hébergement web- Services cron dans divers exemples d'hébergement web.
Voici des instructions supplémentaires pour des hébergeurs spécifiques (vérifiez qu'elle sont bien à jour) :
Utilisation de services cron tiers
Au lieu d'utiliser votre propre serveur pour lancer le cron, vous pouvez utiliser un service tiers (appelé parfois webcron) :
- cron-job.org - un service gratuit (le cron toutes les minutes est possible).
- EasyCron - un fournisseur de cron sur le web qui permet de se passer d'un crontab pour lancer les tâches cron.
Réglages du cron dans Moodle
Certains réglages de Moodle permettent de contrôler divers aspects de l’opération cron :
- Réglages du cron - Réglages du mot de passe du processus cron et du script cron en ligne de commande.
Nouveauté
Moodle 2.7
Cron depuis Moodle 2.7
Le cron a été modifié de manière majeure dans Moodle 2.7, et permet l'exécution de tâches programmées et ad hoc (voir MDL-25499). Les bénéfices de ces changements sont les suivants :
- la programmation de chaque tâche peut être configurée par l'administrateur. Voir Tâches programmées ;
- les tâches peuvent tourner en parallèle ;
- les processus cron utilisent des verrous pour éviter qu'une tâche soit lancée simultanément par des processus différents.
En conséquence, le cron peut être lancé de manière beaucoup plus fréquente (sans risque de blocage), ce qui permet par exemple d'envoyer les messages des forums plus tôt. Il est recommandé de l'adapter à une fréquence d'une fois par minute.
Cron distant
L'utilisation de la version web du cron permet de lancer le cron depuis une machine différente de votre serveur Moodle. Par exemple, on pourra utiliser le cron d'une machine Unix pour lancer la version web du cron d'un Moodle installé sur un serveur Windows. Il faudra que l'utilisation via le web soit autorisée.
Pour savoir si le cron a bien été lancé récemment, il suffit de vous rendre avec un compte administrateur à l'adresse : http://mon.moodle/admin/index.php, ou en passant par « Administration du site > Notifications ».
Le cron a bien été lancé (Attention : la date indiquée concerne la recherche des mises à jour !) | Le cron n'a pas été exécuté depuis au moins 24 heures, voire... n'a jamais été lancé ! |
Débogage des Tâches programmées
Parfois, une tâches programmées particulière peut ne pas fonctionner correctement. Dans les versions de Moodle antérieures à la 2.7 - toute tâche programmées qui déclenchait des erreurs empêchait le reste du CRON de fonctionner. La seule solution pour vérifier si le CRON arrivait à chaque fois à son terme était d'ajouter un mécanisme de vérification automatique exploitant la sortie du CRON en cours (par exemple, en recherchant la chaîne "Cron terminé à").
Dans Moodle 2.7 et suivants, une seule tâche programmées défaillante n'empêchera plus les tâches restantes de s'achever. Lorsqu'une tâche programmée échoue, elle est marquée comme un échec et programmée pour être réessayée. Si la tâche continue d'échouer, la prochaine tâche programmée sera annulée jusqu'à ce qu'elle soit tentée au maximum une fois toutes les 24 heures. Mais en consultant la page d'administration des Tâches programmées, vous pouvez voir si une tâche est encore en échec (elle aura un délai d'échec non nul ce qui représente le nombre de secondes à attendre avant de réessayer une tâche échouée). Un moyen simple de déboguer une tâche défaillante est de l'exécuter immédiatement en utilisant le gestionnaire de tâches programmées et de surveiller sa sortie.
Journalisation et surveillance
Idéalement, vous devriez également enregistrer la sortie de cron quelque part et la surveiller pour détecter d'éventuels problèmes. Vous pouvez surveiller l'état général de cron pour vous assurer qu'il n'y a pas d'erreurs en visitant :
Administration du site > Rapports > Statut du système (/report/status/index.php)
Vous pouvez également connecter ce rapport d'état à des outils comme Icinga / Nagios à l'aide de l'API de vérification (https://docs.moodle.org/dev/Check_API) ou à l'aide de plugins comme https://github.com/catalyst/moodle-tool_heartbeat.
/admin/cli/checks.php
S'il y a des erreurs, vous pouvez obtenir plus de détails sur les tâches récemment exécutées dans la colonne Journaux de la page Tâche programmées, mais cela n'affichera pas les échecs des tâches ad hoc :
Administration du site > Serveur > Tâches > Tâches programmées (/admin/tool/task/scheduledtasks.php)
Pour voir les échecs de tâches ad hoc, vous devez soit réexécuter la tâche manuellement et voir les erreurs, soit avoir déjà collecté les journaux pour examen. Pour un Moodle exécuté sur un seul serveur, vous pouvez vous connecter à un simple fichier journal, ou pour un cluster, vous pouvez utiliser syslogd ou similaire, par exemple :
* * * * * /usr/bin/php /chemin/vers/moodle/admin/cli/cron.php 2>&1 | /usr/bin/logger ...
Lenteurs sur les tâches adhoc
Chaque fois que le CRON est exécuté, les « tâches ad hoc » sont également exécutées une fois que les tâches programmées sont toutes terminées. Alors que les tâches programmées peuvent être exécutées au maximum une fois par minute, les tâches ad hoc peuvent être mises en file d'attente à tout moment, et généralement, vous souhaitez qu'elles soient traitées le plus rapidement possible et ne pas devoir attendre que les tâches programmées soient exécutées en premier. Si vous n'exécutez que la commande principale admin/cli/cron.php, non seulement il se peut que vous deviez attendre que toutes les tâches programmées se terminent en premier, mais même si elles sont terminées, vous devrez peut-être attendre la minute suivante pour que CRON redémarre afin qu'elle soit traitée.
Au lieu de cela, vous pouvez utiliser un ou plusieurs processus de « tâches ad hoc » qui fonctionnent en parallèle avec le processus CRON principal.
Exemple :
* * * * * /usr/bin/php /chemin/vers/moodle/admin/cli/adhoc_task.php --execute --keep-alive=59 * * * * * /usr/bin/php /chemin/vers/moodle/admin/cli/adhoc_task.php --execute --keep-alive=59 ...
À partir de Moodle 3.9, l'option keep-alive ("garder en vie") agit comme un démon. Ainsi, lorsque la file d'attente est vide, plutôt que de se terminer, celui-ci attend que de nouvelles tâches soient mises en file d'attente afin de pouvoir commencer le traitement dès que possible.
Montée en charge de cron avec plusieurs processus
Au fur et à mesure que votre site grandit, de nombreuses tâches programmées prendront plus de temps à s'accomplir, et il y aura également plus de tâches ad hoc en file d'attente qui doivent être traitées. Le système cron est conçu pour fonctionner en parallèle, mais chaque processus individuel ne peut traiter qu'une tâche à la fois, vous devez donc exécuter plusieurs cron cli. Vous pouvez généralement exécuter un nombre assez élevé de processus cron sur une instance cron dédiée avant de devoir exécuter plusieurs instances cron. Pour exécuter plusieurs processus, générez simplement plusieurs processus cron chaque minute :
* * * * * /usr/bin/php /chemin/vers/moodle/admin/cli/cron.php * * * * * /usr/bin/php /chemin/vers/moodle/admin/cli/cron.php * * * * * /usr/bin/php /chemin/vers/moodle/admin/cli/cron.php ... * * * * * /usr/bin/php /chemin/vers/moodle/admin/cli/adhoc_task.php --execute --keep-alive=59 * * * * * /usr/bin/php /chemin/vers/moodle/admin/cli/adhoc_task.php --execute --keep-alive=59 * * * * * /usr/bin/php /chemin/vers/moodle/admin/cli/adhoc_task.php --execute --keep-alive=59 ...
Il peut être particulièrement important d'augmenter le nombre de processus adhoc_task.php car certains plugins et systèmes peuvent générer un très grand nombre de tâches ad hoc, ou des tâches qui peuvent prendre beaucoup de temps à traiter. En particulier, les tâches telles que les conversions de documents et les sauvegardes automatiques peuvent s'accumuler plus rapidement qu'elles ne sont traitées si elles sont laissées sur les paramètres par défaut.
Par défaut, seules 3 tâches programmées et 3 tâches ad hoc peuvent être exécutées simultanément, de sorte que lorsque vous ajoutez plus de processus, vous devez augmenter le niveau de simultanéité autorisé :
Administration du site > Serveur > Tâches > Traitement des tâches
Ou dans config.php
:
$CFG->task_scheduled_concurrency_limit = 20; // Défaut à 3
$CFG->task_adhoc_concurrency_limit = 50; // Défaut à 3
Quoi que vous définissiez, assurez-vous que le ou les serveurs qui les hébergent peuvent gérer confortablement ces nombreux processus. Souvent, le goulot d'étranglement sera un service partagé, généralement la base de données.
Vous pouvez constater que certains types de tâches très longues consomment tous les processus de tâches disponibles, ce qui signifie qu'aucune autre tâche ne s'exécutera. Par exemple, si vous avez 5 processus cli, mais que la file d'attente des tâches comporte 20 tâches ad hoc de sauvegarde automatique, dont chacune prendra dix minutes, alors très rapidement les 5 processus seront consommés par les sauvegardes et rien d'autre. D'autres petites tâches très rapides et légères comme une conversion de document ou des courriels de forum ne seront pas exécutées tant que les sauvegardes ne seront pas terminées et qu'un processus ne sera pas libéré. Pour gérer cela, vous pouvez limiter la simultanéité de types spécifiques de tâches ad hoc. Une bonne règle de base est que si toutes les tâches « lourdes » consomment toutes leurs propres limites, vous devriez encore avoir quelques autres processus en attente pour tout ce qui peut être ajouté à la file d’attente.
Les sauvegardes automatiques sont le pire contrevenant connu, donc hypothétiquement si vous exécutez 50 processus de tâches ad hoc simultanément, une restriction raisonnable pourrait être de limiter les sauvegardes pour qu'elles ne consomment pas plus de la moitié de ces processus, c'est-à-dire 25 au maximum :
Dans config.php
:
$CFG->task_concurrency_limit = [
'core\task\course_backup_task' => 25,
'core_course\task\course_delete_modules' => 5,
];
Voir aussi
Discussions sur les forums d'assistance Moodle (en anglais) :
- Cron - can someone give me a quick confirmation of function?
- Cronjob Question
- Slow cron : avoiding simultaneous cron
- Visibility of cron.php
- How to log the output of a Scheduled Task on Windows - this discussion explains a nice trick that can be very useful when you are experiencing problems with your Windows Scheduled Task and you need to log the output of the Scheduled Task to a log file.