Lorsqu'un module installés dans un contexte Dynacase nécessite de lancer des opérations périodiques, celui-ci peut utiliser le mécanisme de crontab pour spécifier l'ordonnancement de son traitement.
Pour cela, un script d'API `crontab' est disponible :
$ ./wsh.php --api=crontab wsh --api=crontab --cmd=list [--user=<uid>] wsh --api=crontab --cmd=<register|unregister> --file=<path/to/cronfile> [--user=<uid>]
Le script d'API `crontab' permet d'insérer, modifier ou supprimer des fichiers de crontab dans la crontab de l'utilisateur Apache.
Chaque fichier crontab inséré est marqué avec une ligne de commentaire de début et une ligne de commentaire de fin qui permet par la suite d'identifier la section insérés, et de pouvoir la mettre à jour ou bien de la supprimer.
Exemple d'entrée de sections crontab insérée dans la crontab de l'utilsateur Apache :
# crontab -e -u www-data MAILTO=admin-dynacase@example.net PATH=/usr/local/zend/bin:/opt/local/bin:/opt/local/sbin:/usr/X11R6/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/usr/local/bin # BEGIN:FREEDOM_CRONTAB:/var/www/dev:FREEDOM/freedom.cron CONTEXT_ROOT=/var/www/dev # Every hours 01 * * * * [ -f "$CONTEXT_ROOT"/wsh.php ] && [ ! -f "$CONTEXT_ROOT"/maintenance.lock ] && cd "$CONTEXT_ROOT" && ./wsh.php --api=usercard_refreshgroup > /dev/null # Every days 02 5 * * * [ -f "$CONTEXT_ROOT"/wsh.php ] && [ ! -f "$CONTEXT_ROOT"/maintenance.lock ] && cd "$CONTEXT_ROOT" && ./wsh.php --api=freedom_clean --real=yes > /dev/null # Every 5 minutes */5 * * * * [ -f "$CONTEXT_ROOT"/wsh.php ] && [ ! -f "$CONTEXT_ROOT"/maintenance.lock ] && cd "$CONTEXT_ROOT" && ./wsh.php --api=fdl_cronexec > /dev/null # END:FREEDOM_CRONTAB:/var/www/dev:FREEDOM/freedom.cron # BEGIN:FREEDOM_CRONTAB:/var/www/pre-prod:FREEDOM/freedom.cron CONTEXT_ROOT=/var/www/pre-prod # Every hours 01 * * * * [ -f "$CONTEXT_ROOT"/wsh.php ] && [ ! -f "$CONTEXT_ROOT"/maintenance.lock ] && cd "$CONTEXT_ROOT" && ./wsh.php --api=usercard_refreshgroup > /dev/null # Every days 02 5 * * * [ -f "$CONTEXT_ROOT"/wsh.php ] && [ ! -f "$CONTEXT_ROOT"/maintenance.lock ] && cd "$CONTEXT_ROOT" && ./wsh.php --api=freedom_clean --real=yes > /dev/null # Every 5 minutes */5 * * * * [ -f "$CONTEXT_ROOT"/wsh.php ] && [ ! -f "$CONTEXT_ROOT"/maintenance.lock ] && cd "$CONTEXT_ROOT" && ./wsh.php --api=fdl_cronexec > /dev/null # END:FREEDOM_CRONTAB:/var/www/pre-prod:FREEDOM/freedom.cron
Dans cet exemple on a donc deux sections de crontab : - une section pour le fichier `FREEDOM/freedom.cron' du contexte `/var/www/dev' - une section pour le fichier `FREEDOM/freedom.cron' du contexte `/var/www/pre-prod'
Le marqeur de début est : “BEGIN:FREEDOM_CRONTAB:<context_root>:<crontab_file>” Le marqeur de fin est : “END:FREEDOM_CRONTAB:<context_root>:<crontab_file>”
$ ./wiff context pre-prod exec ./wsh.php --api=crontab --cmd=register --file=MON_APP/ma_crontab.cron
Résultat :
# crontab -e -u www-data [...] # BEGIN:FREEDOM_CRONTAB:/var/www/pre-prod:MON_APP/ma_crontab.cron CONTEXT_ROOT=/var/www/pre-prod */5 * * * * [ ! -f "$CONTEXT_ROOT"/maintenance.lock ] && cd "$CONTEXT_ROOT" && echo "Il est $(date +\%H:\%M)" | logger -t horloge # END:FREEDOM_CRONTAB:/var/www/pre-prod:MON_APP/ma_crontab.cron
Pour mettre à jour une section il suffit de faire un “register” du fichier crontab : si la section existe alors elle sera mise-à-jour.
$ ./wiff context pre-prod exec ./wsh.php --api=crontab --cmd=register --file=MON_APP/ma_crontab.cron
$ ./wiff context pre-prod exec ./wsh.php --api=crontab --cmd=unregister --file=MON_APP/ma_crontab.cron
$ ./wiff context pre-prod exec ./wsh.php --api=crontab --cmd=list