La plupart de nos clients, sur leur serveur, souhaitent lancer des tâches planifiées, appelées aussi « tâches cron » (du nom du logiciel qui les lancent sur le serveur).
Ces tâches planifiées permettent d’exécuter des commandes de manière régulière, par exemple toutes les deux minutes, toutes les minutes ou toutes les cinq minutes… Ces commandes permettent de gérer des travaux qui doivent être effectués en arrière-plan sur le serveur.
Généralement, nous vous recommandons de programmer ces tâches à l’aide de la commande crontab -e lancée via SSH sur le compte qui fait tourner votre application.
Cette commande vous permet de lancer un éditeur de texte pour modifier les tâches planifiées lancées sous le compte de l’utilisateur Linux faisant tourner votre application.
Verrouiller sa tâche :
Malheureusement, certaines de ces commandes peuvent parfois durer plus longtemps que prévu. Par exemple, une commande lancée toutes les 2 minutes, si elle dure 10 minutes pour s’exécuter, le risque est fort que cette commande soit lancée deux fois en parallèle.
Aussi, pour éviter de telles situations, nous recommandons très vivement de mettre ce que l’on appelle un verrou ou un lock sur vos tâches planifiées. Chez Octopuce, nous recommandons d’utiliser l’outil flock pour ce faire.
Voici un exemple de ligne de commande cron utilisant flock :
*/2 * * * * /usr/bin/flock -n /run/lock/app-job-1 php8.2 /var/www/prod/bin/console app:job-1
Note: si vous devez faire un « cd » dans votre tache, il faut le lancer avant le flock comme dans l’exemple ci-dessous :
*/2 * * * * cd /var/www/prod ; /usr/bin/flock -n /run/lock/app-job-1 php8.2 bin/console app:job-1
Dans certaines situations, ces tâches planifiées peuvent aussi planter, mais planter non pas en s’arrêtant, mais en restant coincées. Dans cette situation, nous recommandons d’utiliser un autre outil appelé timeout, qui permet de préciser que si une commande dépasse une certaine durée, elle doit être automatiquement arrêtée. Par exemple :
*/2 * * * * /usr/bin/flock -n /run/lock/app-job-1 /usr/bin/timeout 1h php8.2 /var/www/prod/bin/console app:job-1
Lancer des tâches sous forme d’appel à une page web :
Parfois, votre tâche consiste à appeler une page web qui fera tourner votre code.
Tout d’abord nous déconseillons ce mode de fonctionnement : l’usage d’outil comme PHP-CLI ou Python en cli permet de garantir un meilleur environnement, notamment éviter de prendre un socket du serveur web pendant toute cette durée, et permettre de disposer de plus de RAM ou de CPU dans votre tâche planifiée.
Cependant, si vous devez le faire, voici ce que nous vous recommandons :
- lancez votre tâche à l’aide de wget
- passez les options permettant de ne pas l’exécuter plusieurs fois, et de disposer d’une durée d’exécution suffisante
- ne mémoriser pas le résultat de la commande si votre page web retournée n’a pas de sens pour vous
- si vous souhaitez la mémoriser, faites de telle sorte que les journaux (logs) ainsi conservés soient tournés pour ne pas en garder plus que quelques jours
Exemple de tâche cron utilisant wget sans conserver la sortie :
*/10 * * * * wget --quiet --tries=1 --output-document=/dev/null --timeout=180 https://monsite.fr/mapage/quilance/latache.php
Autre exemple : une tâche cron produisant un journal, mais ne gardant que 1 semaine les journaux concernés :
*/10 * * * * preprod wget --quiet --tries=1 --output-document=- --timeout=180 https://monsite.fr/mapage/quilance/latache.php >>/var/www/preprod/logs/crontab-$(date +%Y%m%d).log
0 2 * * * find /var/www/preprod/logs/ -iname "crontab-*" -mtime +7 -delete
Note: le « output-document » ici est « – » ce qui signifie « ne sauve pas la page web, mais l’affiche » et le « >> » à la fin précise « n’affiche pas le contenu, mais sauve le en ajout à la fin d’un fichier (ici le fichier journal).
Vous remarquerez aussi qu’une seconde tache planifiée est chargée de supprimer les fichiers journaux de plus de 7 jours. Sans elle, vous finiriez par remplir votre dossier logs de journaux, remplissant votre serveur, mais aussi conservant des informations inutiles.
Lien direct octo.re/265
