Planification de tâches avec des tâches cron

Les tâches cron sont utilisées pour planifier des tâches à exécuter sur le serveur. Ils sont le plus souvent utilisés pour automatiser la maintenance ou l'administration du système. Cependant, ils sont également pertinents pour le développement d'applications Web. Il existe de nombreuses situations dans lesquelles une application Web peut nécessiter l'exécution périodique de certaines tâches. Aujourd'hui, nous allons explorer les bases de Cron Jobs.

Définitions

Commençons par nous familiariser avec les termes liés à ce sujet.

"Cron" est un planificateur de travaux basé sur le temps utilisé dans les systèmes d'exploitation de type Unix (Linux, FreeBSD, Mac OS, etc.). Et ces emplois ou tâches sont appelés "tâches cron".

Il existe un "démon" cron qui s'exécute sur ces systèmes. Un démon est un programme qui s'exécute en arrière-plan tout le temps, généralement à l'initiative du système. Ce démon cron est responsable du lancement de ces tâches cron dans les délais..

La planification réside dans un fichier de configuration nommé "crontab". C'est là que sont répertoriées toutes les tâches et leurs minuteries.

Pourquoi utiliser Cron Jobs?

Les administrateurs de serveur utilisent depuis longtemps les tâches cron. Mais puisque le public cible de cet article est constitué de développeurs Web, examinons quelques cas d'utilisation de tâches cron pertinentes dans ce domaine:

  • Si vous avez un site d'adhésion, où les comptes ont des dates d'expiration, vous pouvez planifier des tâches cron pour désactiver ou supprimer régulièrement les comptes dont la date d'expiration est dépassée..
  • Vous pouvez envoyer des e-mails quotidiens à la newsletter.
  • Si votre base de données contient des tableaux récapitulatifs (ou des vues matérialisées), vous pouvez les mettre à jour régulièrement avec un travail cron. Par exemple, vous pouvez stocker chaque page Web consultée dans un tableau, mais un autre tableau récapitulatif peut contenir des résumés quotidiens du trafic..
  • Vous pouvez expirer et effacer des fichiers de données en cache dans un certain intervalle.
  • Vous pouvez vérifier automatiquement le contenu de votre site Web à la recherche de liens brisés et recevoir régulièrement un rapport par e-mail..
  • Vous pouvez planifier l'exécution de tâches de longue durée à partir d'un script de ligne de commande plutôt que de les exécuter à partir d'un script Web. Comme encoder des vidéos ou envoyer des e-mails en masse.
  • Vous pouvez même effectuer quelque chose d'aussi simple que de récupérer vos derniers Tweets, pour les mettre en cache dans un fichier texte..

Syntaxe

Voici un travail cron simple:

 10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1

Il y a deux parties principales:

  1. La première partie est "10 * * * *". C'est ici que nous programmons le chronomètre.
  2. Le reste de la ligne est la commande telle qu'elle serait lancée à partir de la ligne de commande.

La commande elle-même dans cet exemple comporte trois parties:

  1. "/ usr / bin / php". Les scripts PHP ne sont généralement pas exécutables par eux-mêmes. Nous devons donc l'exécuter via l'analyseur PHP.
  2. "/www/virtual/username/cron.php". Ceci est juste le chemin du script.
  3. "> / dev / null 2> & 1". Cette partie traite la sortie du script. Plus sur cela plus tard.

Syntaxe de chronométrage

Ceci est la première partie de la chaîne de travail cron, comme mentionné ci-dessus. Il détermine la fréquence et le moment d'exécution du travail cron..

Il se compose de cinq parties:

  1. minute
  2. heure
  3. jour du mois
  4. mois
  5. jour de la semaine

Voici une illustration:

Astérisque

Assez souvent, vous verrez un astérisque (*) au lieu d’un nombre. Cela représente tous les nombres possibles pour cette position. Par exemple, un astérisque dans la position minute le ferait courir toutes les minutes.

Nous devons examiner quelques exemples pour bien comprendre cette syntaxe..

Exemples:

Cette tâche cron sera exécutée toutes les minutes, tout le temps:

 * * * * * [commande]

Cette tâche cron sera exécutée à la minute zéro, toutes les heures (c.-à-d. Une tâche cron horaire):

 0 * * * * [commande]

Il s’agit également d’un travail cron horaire, mais exécuté à la minute 15 (par exemple, 00h15, 01h15, 02h15, etc.):

 15 * * * * [commande]

Ce sera une fois par jour, à 2h30 du matin:

 30 2 * * * [commande]

Celui-ci se déroulera une fois par mois, le deuxième jour du mois à minuit (le 2 janvier à midi, le 2 février à midi, etc.):

 0 0 2 * * [commande]

Ce programme se déroulera le lundi, toutes les heures (soit 24 fois par jour, mais uniquement le lundi):

 0 * * * 1 [commande]

Vous pouvez utiliser plusieurs numéros séparés par des virgules. Cela fonctionnera trois fois toutes les heures, aux minutes 0, 10 et 20:

 0,10,20 * * * * [commande]

Un opérateur de division est également utilisé. Cela fonctionnera 12 fois par heure, c'est-à-dire toutes les 5 minutes:

 * / 5 * * * * [commande]

Dash peut être utilisé pour spécifier une plage. Ce sera une fois par heure entre 5h00 et 10h00:

 0 5-10 * * * [commande]

De plus, il existe un mot clé spécial qui vous permettra d’exécuter un travail cron à chaque redémarrage du serveur:

 @reboot [commande]

Configuration et gestion des tâches cron

Il existe différentes manières de créer et de gérer vos tâches cron..

Panneaux de contrôle

Beaucoup de sociétés d'hébergement Web fournissent des panneaux de contrôle pour leurs clients. Si vous êtes l'un d'entre eux, vous pourrez peut-être trouver une section dans votre panneau de configuration pour gérer vos tâches cron..

Modification de la crontab

Exécuter cette commande lancera vi (éditeur de texte) et vous permettra d’éditer le contenu de la crontab:

 crontab -e

Il serait donc utile de se familiariser avec les commandes de base de vi car elles sont très différentes de tout autre éditeur de texte avec lequel vous avez pu travailler..

Si vous souhaitez simplement voir la crontab existante sans la modifier, vous pouvez exécuter cette commande:

 crontab -l

Pour supprimer le contenu de la crontab:

 crontab -r

Chargement d'un fichier

Vous pouvez écrire tous vos travaux cron dans un fichier, puis le placer dans la crontab:

 crontab cron.txt

Soyez prudent, car cela écrasera tous les travaux cron existants avec le contenu de ce fichier, sans avertissement..

commentaires

Vous pouvez ajouter des commentaires suivis du caractère #.

 # Ce travail cron fait quelque chose de très important 10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1

Paramétrer l'e-mail

Comme je l'ai mentionné précédemment, par défaut, la sortie du fichier cron est envoyée par courrier électronique, à moins que vous ne le supprimiez ou que vous ne le redirigiez vers un fichier. Le paramètre MAILTO vous permet de définir ou de modifier l’adresse électronique à laquelle les envoyer:

 MAILTO = "[email protected]" # Ce travail cron est très important 10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1

Utiliser le PHP Parser

Les scripts CGI sont exécutables par défaut, mais pas les scripts PHP. Ils doivent utiliser l'analyseur PHP. C'est pourquoi nous devons placer le chemin de l'analyseur avant le chemin du script..

 * * * * * / usr / bin / php [chemin d'accès au script php]

Parfois, il se peut que ce soit sous un autre emplacement tel que: "/ usr / local / bin / php". Pour le savoir, vous pouvez essayer d'exécuter ceci en ligne de commande:

 quel php

Manipulation de la sortie

Si vous ne gérez pas la sortie du script cron, il les enverra par courrier électronique à votre compte utilisateur sur le serveur..

Rejet de sortie

Si vous mettez "> / dev / null 2> & 1" à la fin de la commande du travail cron (ou de toute commande), la sortie sera ignorée..

Le crochet de fermeture (>) est utilisé pour rediriger la sortie. "/ dev / null" est comme un trou noir pour la sortie. Tout ce qui s'y passe est ignoré par le système.

Cette partie "2> & 1" entraîne la redirection de la sortie STDERR (erreur) vers la sortie STDOUT (normale). Donc, cela se termine également dans le "/ dev / null".

Sortie dans un fichier

Pour stocker la sortie cron dans un fichier, utilisez à nouveau le crochet de fermeture (>):

 10 * * * * / usr / bin / php /www/virtual/username/cron.php> /var/log/cron.log

Cela réécrira le fichier de sortie à chaque fois. Si vous souhaitez ajouter la sortie à la fin du fichier au lieu d’une réécriture complète, utilisez plutôt un crochet de fermeture double (>>):

 10 * * * * / usr / bin / php /www/virtual/username/cron.php >> /var/log/cron.log

Scripts Exécutables

Normalement, vous devez spécifier l'analyseur au début de la commande, comme nous l'avons fait auparavant. Mais il existe un moyen de rendre vos scripts PHP exécutables à partir de la ligne de commande comme un script CGI..

Vous devez ajouter le chemin d'accès à l'analyseur en tant que première ligne du script:

 #! / usr / local / bin / php 

Assurez-vous également de définir le bon chmod (comme 755) pour rendre le fichier exécutable..

Lorsque vous avez un script exécutable, le travail cron peut être plus court comme ceci:

 10 * * * * /www/virtual/username/hello.php

Prévention de la collision de tâches cron

Dans certains cas, il se peut que des tâches cron soient exécutées fréquemment et que vous ne souhaitiez pas qu'elles entrent en collision si leur exécution dure plus longtemps que la fréquence.

Par exemple, vous pouvez avoir une tâche cron exécutée toutes les minutes. Pourtant, de temps en temps, la course peut prendre plus d’une minute. Cela peut entraîner l'exécution d'une autre instance du même script cron avant la fin de la précédente. Vous pouvez créer trop de processus occupés de cette manière et éventuellement bloquer le serveur s'ils se ralentissent mutuellement, et créer encore plus de processus au fil du temps…

Ce problème peut être résolu via le verrouillage de fichier, et plus particulièrement le type de verrouillage de fichier non bloquant (LOCK_NB). (Si vous n'êtes pas familier avec le verrouillage de fichier, je vous suggère de le lire en premier.)

Vous pouvez ajouter ce code au script de travail cron:

 $ fp = fopen ('/ tmp / lock.txt', 'r +'); if (! flock ($ fp, LOCK_EX | LOCK_NB)) echo 'Impossible d'obtenir le verrou'; sortie (-1);  / *… * / Fclose ($ fp);

Avec des verrous de fichiers classiques, l'appel de la fonction flock () bloquerait le script s'il existe un verrou. Et il se libérerait une fois que ce verrou est parti. Cependant, avec un verrou non bloquant, tel que dans le code ci-dessus, l'appel de fonction n'arrête pas le script, mais renvoie immédiatement FALSE s'il existe un verrou. Donc, dans ce cas, nous pouvons immédiatement quitter le script quand nous voyons qu'il existe un verrou, ce qui indique qu'un autre travail cron est en cours d'exécution..

Blocage de l'accès Web aux tâches cron

Lorsque vous écrivez un travail cron dans un langage de script Web tel que PHP, vous pouvez être sûr que personne ne peut l'exécuter en le chargeant simplement à partir de son navigateur. Une option simple serait de stocker ces scripts en dehors de votre dossier Web. Cependant, cela peut ne pas être pratique ou préférable pour certains développeurs, s'ils souhaitent conserver leurs scripts de travail cron dans leurs dossiers d'applications Web..

Si vous mettez tous les scripts de travail cron dans un dossier, vous bloquez l'accès en mettant cette ligne dans un fichier .htaccess:

 nier à tous

Ou vous pouvez également refuser l'accès aux scripts sur une base individuelle en mettant cette ligne au début:

 if (isset ($ _ SERVER ['REMOTE_ADDR']))) die ('Autorisation refusée.');

Cela garantira que, lorsque le script sera accessible depuis le Web, il sera immédiatement abandonné..

Conclusion

Merci pour la lecture. Même si les tâches cron semblent être un outil réservé aux administrateurs système, elles sont en réalité pertinentes pour de nombreux types d'applications Web..

S'il vous plaît laissez vos commentaires et questions, et passez une bonne journée!

Écrire un tutoriel Plus

Saviez-vous que vous pouvez gagner jusqu'à 600 USD en écrivant un tutoriel et / ou un screencast PLUS pour nous?? Nous recherchons des didacticiels détaillés et bien écrits sur HTML, CSS, PHP et JavaScript. Si vous en avez la possibilité, veuillez contacter Jeffrey à l'adresse [email protected]..

Veuillez noter que la rémunération réelle dépendra de la qualité du didacticiel final et du screencast..

  • Suivez-nous sur Twitter ou abonnez-vous au fil RSS Nettuts + pour obtenir les meilleurs tutoriels de développement Web sur le Web..