====== 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) * 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.