Programmer des actions sur son instance (cron)

Il n'y a pas de crontab à proprement parler sur les instances de Simple Hosting, mais il existe un outil, tout aussi puissant : anacron

Définition

Le principe est le suivant : vous choisissez la périodicité d’exécution de votre action, et vous l'entrez dans le fichier de configuration de votre instance. Chaque action déterminée sera alors exécutée à chaque rotation de périodicité.
Il est évidemment possible de déterminer une périodicité différente pour chaque action.
Notre version d'anacron est légèrement différente de la version “officielle”. En effet, nous avons modifié notre version pour qu'elle offre une plus petite valeur de périodicité, vous laissant plus de possibilités dans celle-ci.
La plus petite unité périodique est donc l'heure.

Fonctionnement

Le fichier à éditer est anacrontab. Il est unique à l'instance et se trouve ici :

  • via SFTP : lamp0/etc/cron/anacrontab
  • via la console : /srv/data/etc/cron/anacrontab

Vous pouvez indiquer des commentaires dans le fichier en ajoutant un '#' au début de la ligne.

Déterminer la périodicité

La périodicité est fixée par un multiplicateur et un indice de périodicité.
Les indices de périodicité sont les suivants (du plus petit au plus grand) :

  • hourly (heure)
  • daily (jour)
  • weekly (semaine)
  • monthly (mois)
  • yearly (année)

Pour déterminer la périodicité de votre action, il suffit de multiplier l'indice par la valeur souhaitée.

Par exemple, si je souhaite effectuer une action toutes les 2 heures, je vais alors noter : 2@hourly
Si je souhaite qu'une opération se déroule chaque jour, comme un backup de ma base de données par exemple, je peux le noter de plusieurs façons :
24@hourly signifie toutes les 24 heures
1@daily signifie une fois par jour (il peut également s'écrire @daily, sans multiplicateur puisque celui-ci est égal à 1)

Syntaxe

Maintenant que vous savez déterminer la périodicité, il vous suffit de connaître la syntaxe. Celle-ci se décompose en 4 parties :
périodicité délai nom-unique action

Le délai n'est pas utilisé dans notre version et sera ignoré, mais il doit tout de même être noté (par souci de compatibilité). Mettez un 0 de façon systématique.

Le nom unique ne sert qu'à identifier la tâche confiée à anacron. Ce nom doit impérativement être unique.
L'action, vous devez la connaître, puisque c'est ce que vous souhaitez réaliser :)
Dans notre exemple, nous allons programmer une purge quotidienne des fichiers temporaires de plus de 7 jours :

@daily 0 purgetmp find /srv/data/tmp -type f -mtime +7 -delete >> /dev/null

@daily stipule que cette action doit se dérouler une fois par jour (nous aurions pu noter 1@daily). 0 correspond à la valeur de délai qui sera ignorée par le système. purgetmp est le nom unique que j'ai attribué à mon action afin de l'identifier dans ma liste. find /srv/data/tmp -type f -mtime +7 -delete » /dev/null est la commande qui sert à supprimer les fichiers temporaires de plus de 7 jours.

Exemples d'utilisation

Export des bases de données MySQL

Dans le cas où vous utiliser les snapshots pour effectuer une sauvegarde de votre instance, les bases de données MySQL sont stockés au format brut, ce qui ne permet pas la récupération simple des données en cas de problèmes. Pour disposer d'une sauvegarde de vos bases, il est nécessaire d'effectuer un export avec 'mysqldump'. Afin de disposer de sauvegardes à jour, vous pouvez ajouter une tâche anacron afin d'effectuer une sauvegarde régulière. Voici un exemple que vous pouvez ajouter sur votre instance (moyennant une petite adaptation de votre part) :

@daily 0 mysql_backup mkdir -p /srv/data/tmp/mysql_backup ; mysqldump -u root {-pPASSWORD} --all-databases | /bin/gzip -9 > /srv/data/tmp/mysql_backup/`date '+%F'`.databases.sql.gz ; rm -f /srv/data/tmp/mysql_backup/`date '+%F' --date '1 week ago'`.databases.sql.gz

Cette ligne permettra d'effectuer un export de toutes les bases tous les jours, et conservera le dernier export durant une semaine.

Pensez à adapter la commande selon votre configuration, si l'utilisateur 'root' n'a pas de mot de passe, alors vous pouvez supprimer {-pPASSWORD}, sinon supprimer les crochets {} indiquez le mot de passe de l'utilisateur 'root' à la suite de '-p'.

Vous pouvez exécuter la commande directement via la console pour vérifier son fonctionnement.

Export des bases de données PostgreSQL

L'utilisation est similaire à MySQL, la commande pg_dumpall permettant de sauvegarder l'ensemble des bases postgresql de l'instance.

@daily 0 psql_backup mkdir -p /srv/data/tmp/psql_backup ;  pg_dumpall --username=hosting-db -h localhost > /srv/data/tmp/psql_backup/`date '+%F'`.databases ; rm -f /srv/data/tmp/psql_backup/`date '+%F' --date '1 week ago'`.databases

Exécution d'un script PHP

Vous pouvez également executer des scripts écrits en PHP. Pour cela, il suffit d'utiliser la commande php avec l'option -f et le chemin vers le fichier.

Vos fichiers se trouvent toujours au même emplacement (/srv/data/web/vhosts), suivis du répertoire du VHOST et le chemin vers le fichier au sein du code de votre application.

Dans cet exemple, nous exécutons quotidiennement un fichier appelé cron.php qui est à la racine de notre VHOST www.example.com

@daily 0 my_php_script php -f /srv/data/web/vhosts/www.example.com/cron.php

FAQ

Pourquoi anacron au lieu de cron ?

Anacron possède l'avantage en cas d'arrêt de l'instance (disque plein), de se lancer au démarrage et d'exécuter les tâches planifiées lorsque l'instance était hors ligne. Avec cron ces tâches n'auraient pas été lancées et une importante tâche de sauvegarde aurait pu être manquée.

Quand sont lancées mes tâches anacron ?

Un service vérifie toute les heures que l'ensemble des tâches planifiées ont été lancées. La minute et seconde exacte est basée sur le démarrage de l'instance auquel est ajouté un délai aléatoire pour répartir la charge sur les équipements hébergeant de grand nombre d'instances.

Dernière modification: le 09/02/2017 à 22:27 par Jonathan G. (Gandi)