GNU/Linux >> Tutoriels Linux >  >> Linux

Utilisation d'un script d'encapsulation Cron

Ce didacticiel est destiné à faire deux choses :développer l'article de dépannage de Cron ; et pour donner un aperçu d'un concept de script simple qui utilise la création d'un fichier comme indicateur pour signifier que quelque chose est en cours d'exécution. Ceci est principalement utile lorsque vous devez exécuter quelque chose en continu, mais pas plus d'une copie à la fois. Vous pouvez créer un fichier en tant qu'indicateur pour vérifier si une tâche est déjà en cours d'exécution, et à son tour, vérifier cet indicateur avant d'entreprendre d'autres actions.

L'application directe de ceci est lorsque vous avez une tâche cron qui s'exécute toutes les minutes ou toutes les quelques minutes. Avec un cron qui se répète rapidement, si la tâche précédente prend plus de temps que prévu, ces tâches peuvent s'accumuler, entraînant une charge sur le serveur ou exacerbant d'autres problèmes. Pour éviter cela, un simple script peut être configuré dans la crontab (à la place de la tâche cron prévue). Lorsque le cron est exécuté, il n'exécute la tâche réelle que s'il n'y a pas de processus concurrent déjà en cours d'exécution.

Pourquoi utiliser un wrapper Cron ?

Un wrapper cron est utilisé lorsque vous avez une tâche cron qui doit s'exécuter de manière consécutive mais qui ne doit pas marcher sur elle-même. C'est bon pour les tâches que vous souhaitez configurer pour qu'elles s'exécutent en continu. Les tâches qui doivent être exécutées entre toutes les minutes et toutes les cinq minutes doivent utiliser un wrapper comme celui-ci.

Si vous n'utilisez pas de wrapper sur une tâche cron qui s'exécute trop fréquemment, vous pouvez exécuter plusieurs tâches en même temps en essayant de faire la même chose. Ces tâches concurrentes ralentissent l'ensemble des travaux. Ces "tâches cron empilées" peuvent même devenir tellement incontrôlables qu'elles surchargent un serveur et l'empêchent de répondre normalement.

Qu'est-ce qu'un wrapper Cron ?

La raison pour laquelle cela s'appelle un wrapper cron est qu'il s'agit d'un script qui encapsule le travail cron et vérifie si une autre instance du cron est déjà en cours d'exécution. S'il y a une autre copie en cours d'exécution, le wrapper obligera le cron à ignorer cette exécution et attendra la prochaine exécution pour vérifier à nouveau. Il existe plusieurs façons pour les wrappers cron d'éviter tout chevauchement.

Méthode de vérification du processus

Une façon consiste à vérifier tous les processus en cours d'exécution pour l'utilisateur et à vérifier qu'il n'y a pas déjà un autre processus avec le même nom ou les mêmes attributs que celui que vous souhaitez exécuter. C'est ainsi que fonctionne le fichier cron.sh de Magento, il vérifie si une autre instance de cron.php est exécutée en tant qu'utilisateur, et s'il y en a une en cours d'exécution, il se ferme. Cela peut être compliqué à faire de manière fiable, et ce n'est donc pas quelque chose que nous recommandons pour commencer.

Méthode du fichier de verrouillage

Une méthode simple consiste à utiliser ce qu'on appelle un fichier de verrouillage. L'encapsuleur cron vérifie si le fichier de verrouillage (tout fichier avec un nom/emplacement spécifique) existe au début de l'exécution. Si le fichier de verrouillage est manquant, le script crée ce fichier et continue. La création du fichier de verrouillage signale le début de la tâche cron. Lorsque la tâche cron se termine, le script wrapper supprime le fichier de verrouillage.

Tant que le fichier de verrouillage existe, un nouveau wrapper n'exécutera pas le reste de la tâche cron pendant qu'un autre est en cours d'exécution. Une fois la première exécution terminée et le verrou supprimé, un autre wrapper pourra à nouveau créer un nouveau fichier de verrouillage et traiter normalement.

Un exemple de script wrapper

Pour commencer, nous voulons créer un script bash simple. Dans un fichier, nous indiquons le script à interpréter par le programme /bin/bash

#!/bin/bash

Ensuite, nous voulons définir le nom et l'emplacement du fichier de verrouillage que nous utiliserons comme drapeau.

# Set lockfile name and location
lockfile="~/tmp/cronwrapper.lock"

Ensuite, le script doit vérifier si ce fichier de verrouillage existe. S'il existe, une autre copie du script est déjà en cours d'exécution et nous devons quitter le script.

# Check if the lockfile exists
if [[ -f $lockfile ]]; then
# If the lockfile exists quit
exit;

Sinon, si le fichier de verrouillage n'existe pas, nous devons créer un nouveau fichier de verrouillage pour signifier que nous continuons avec le reste du script. La création du fichier de verrouillage indique également à toutes les futures copies susceptibles d'être exécutées d'attendre jusqu'à ce que le fichier de verrouillage soit supprimé. Nous souhaitons également inclure le travail réel à exécuter, qu'il s'agisse d'un appel à une URL via le Web, de l'exécution d'un fichier PHP sur la ligne de commande ou de toute autre chose.

# If the lockfile is missing continue
else
# Create the lockfile
touch $lockfile
# Insert cron task here/code>

Une fois que la tâche prévue est exécutée et terminée, nous voulons nettoyer notre fichier de verrouillage, afin que la prochaine exécution de la tâche cron sache que la dernière exécution est terminée et que tout est prêt à recommencer.

# Cleanup the lockfile
rm -f $lockfile
fi

Dans l'exemple ci-dessus, il est pratique de définir le fichier de verrouillage comme une variable ($lockfile) afin qu'il puisse être facilement référencé ultérieurement. De plus, si vous souhaitez modifier l'emplacement, vous n'avez qu'à le modifier à un endroit dans le script.

Cet exemple utilise également un "~" dans le chemin d'accès au fichier de verrouillage comme raccourci. Cela indique au shell d'assumer le répertoire personnel de l'utilisateur. En tant que tel, le chemin complet ressemblerait plus à ceci :/home/username/tmp/cron.lock.

Cependant, en utilisant le "~", vous pouvez utiliser des copies du même script pour plusieurs utilisateurs sur le même serveur, et ne pas avoir à modifier le chemin complet pour chaque utilisateur. Le shell utilisera automatiquement le répertoire personnel de chaque utilisateur lors de l'exécution du script wrapper.

Tout mettre ensemble (cronwrapper.sh)

Vous pouvez copier et coller ce qui suit dans l'éditeur de texte de votre choix sur votre serveur. Vous pouvez lui donner le nom que vous voulez, mais voici toutes les pièces assemblées.

#!/bin/bash
lockfile="~/tmp/cronwrapper.lock"
if [[ -f $lockfile ]]; then
exit;
else
touch $lockfile
# Insert cron task here
rm -f $lockfile
fi

Ceci est un exemple très simple et pourrait être développé beaucoup plus loin. Idéalement, vous pouvez ajouter une vérification pour ignorer un fichier de verrouillage datant de plus d'une heure et pour exécuter de toute façon une nouvelle instance de tâche cron. Cela représenterait un travail interrompu qui n'a pas pu être nettoyé après lui-même. Une autre extension peut être de confirmer que le travail précédent s'est terminé proprement. Ou encore une autre suggestion, vérifierait les erreurs de la tâche cron en cours d'exécution et prendrait des décisions ou enverrait des alertes en fonction de ces erreurs. Le monde est votre huître quand il s'agit de cron wrappers ! Jetez un coup d'œil aux serveurs VPS de notre Liquid Web, pour que des tâches comme celles-ci se déroulent sans problème.


Linux
  1. Utilisation d'at pour les tâches cron à usage unique sous Linux

  2. Comment créer un script de démarrage à l'aide de Crontab dans Lubuntu Linux

  3. Comment détecter la virtualisation à l'aide du script Sys::Detect::Virtualization Perl ?

  4. Utiliser Notify-send avec Cron ?

  5. Planifier le script Apt-get à l'aide de Cron ?

Conseils Linux pour utiliser cron pour planifier des tâches

Comment automatiser des tâches sous Linux à l'aide de Crontab

Installez facilement Golang sous Linux à l'aide du script Update-golang

Passer les paramètres $_GET à la tâche cron

Autorisation refusée avec bash.sh pour exécuter cron

Comment quitter le terminal Linux en utilisant le script Python ?