Elysia_cron

Portrait de titouille

Drupal possède un "cron" par défaut, puis chaque module peut implémenter sa propre méthode "hook_cron", qui sera appelée à chaque appel de cron.php.
Le problème réside dans la fréquence des appels cron. Si on appelle le cron chaque heure, on risque de passer à côté de certaines tâches qui devraient être exécutées plus fréquemment. A l'inverse, si une tâche cron lourde est appelée chaque heure, le serveur sera ralenti par l'exécution de ces tâches, qu'on aurai pu espacer (chaque 24h par exemple).

Elysia_cron est un petit module bien pratique. Il permet de paramétrer des tâches "cron" qui seront exécutées indépendamment les unes des autres. Chaque tâche va pouvoir être affectée à une intervalle particulière, et sera exécutée proprement lors de l'appel du cron.

Néanmoins, pour exécuter proprement le cronjob, il est nécessaire de le rajouter dans la configuration du serveur. Pour éditer le fichier des tâches cron, il suffit d'entrer la ligne de commande suivante (debian) :

crontab -e

Le problème maintenant, c'est de faire en sorte qu'un nouveau job soit ajouté et exécuté chaque minute. Pour ce faire, il suffit d'utiliser la syntaxe suivante :

* * * * *

cette dernière permet d'exécuter le job à toutes les minutes de toutes les heures de tous les jours de tous les mois de toutes les années... Vous l'aurez compris, chaque minute, qu'il pleuve, qu'il vente ou qu'il neige.

Après avoir fait des recherches sur le net, voici le genre de syntaxe complète qu'il était indiqué :

* * * * * wget /usr/bin/wget -O - -q -t 1 http://www.monsite.com/sites/all/modules/elysia_cron/cron.php

Le souci, c'est que lorsque cette tâche est exécutée, j'ai un joli retour négatif comme quoi il n'arrive pas à trouver le fichier /includes/bootstrap.inc :


Warning: include_once(./includes/bootstrap.inc): failed to open stream: No such file or directory in /home/watch/www/sites/all/modules/elysia_cron/cron.php on line 12

Warning: include_once(): Failed opening './includes/bootstrap.inc' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /home/watch/www/sites/all/modules/elysia_cron/cron.php on line 12

Fatal error: Call to undefined function drupal_bootstrap() in /home/watch/www/sites/all/modules/elysia_cron/cron.php on line 13

Tout ceci à cause d'une problématique de chemin relatif / chemin absolu.
J'ai du faire pas mal de tests afin de finalement réussir à m'y retrouver.

Au final : dans le répertoire racine de mon site, j'ai créé un fichier nommé elysia_cron.sh. J'y ai mis le contenu suivant :

#!/bin/bash
cd /home/watch/www
/usr/bin/php sites/all/modules/elysia_cron/cron.php

J'ai ensuite rendu ce fichier exécutable

chmod +x elysia_cron.sh

Puis j'ai enfin rajouté la ligne suivante dans le fichier crontab :

* * * * * bash /home/watch/www/elysia_cron.php

Et cette fois-ci ça fonctionne, le cron est appelé à chaque minute, et le module Elysia_cron exécute proprement les tâches selon leur paramétrage en terme de délai.

En espérant que ça puisse servir. J'ai fait ça à la "one again" histoire que ça tourne, mais je ne suis pas non plus contre de meilleures techniques pour mettre tout ça en place Wink