GNU/Linux >> Tutoriels Linux >  >> Linux

Gestion des tâches Cron en double lors de l'exécution de scripts

Si pendant un certain temps, vous avez observé un modèle spécifique sur votre appareil Linux déclenchant une alarme pour une utilisation élevée du CPU/de la mémoire, il est recommandé d'analyser l'ensemble des processus qui étaient en cours d'exécution au moment de l'alarme.

Au cours de l'analyse, vous pouvez constater qu'un processus ou un script spécifique exécute plusieurs instances simultanément en raison d'un appel en double sur un processus planifié (qui a été configuré à l'aide de tâches cron).

Pour éviter que cela ne se produise, vous pouvez utiliser deux alternatives :

Configuration d'un fichier de verrouillage

Dans le script, implémentez une procédure qui vérifie si un fichier existe. Si ce n'est pas le cas, le script le créera et continuera à s'exécuter comme prévu. Si le fichier n'est pas requis une fois le script terminé, vous pouvez le supprimer pour vous assurer que la prochaine exécution de la tâche ne le considérera pas comme "en cours d'utilisation".

Configuration d'un fichier PID en BASH

Semblable à la méthode mentionnée ci-dessus, l'utilisation d'un fichier Process ID (PID) repose sur la lecture d'un fichier, à la différence que dans ce fichier, le PID de l'instance en cours d'exécution est placé, cela permettra de valider que le processus si le processus est en cours d'exécution, tandis que le fichier de verrouillage vérifie uniquement que le script a commencé à s'exécuter, sans tenir compte s'il est toujours en cours d'exécution ou s'il a été mis en pause/terminé avant la suppression du fichier.

Étapes de configuration :

Grâce à l'extrait de code ci-dessous, vous pouvez voir un exemple du code que vous implémenteriez dans votre script. Le texte qui commence par un symbole dièse (#) est un commentaire dans le code, il peut donc être supprimé lors de l'implémentation finale.

REMARQUE : Sachez que vous devez d'abord tester si le script correspond à vos besoins. Ne présumez pas que cela peut fonctionner du premier coup. Des modifications peuvent être nécessaires.

# A. Define your PID file using the full path where it'll be located.
# Do not place your code within any /tmp folder as these get cleaned up automatically and might interfere with the expected behaviour of the script.

# B. Check if the PID file exists, if it does, it will run the intended function.
PIDFILE = /var/apps/testscript.pid

# 1. Read the content of our PID file (with cat), and assign it to the PID variable
if [ -f $PIDFILE ] then
    # 2. Verify if the content of the file is a running process
    PID = $(cat $PIDFILE)

    # In here, the '%?' variable obtains the exit code from our previous command
    ps -p $PID > /dev/null 2>&1

    # 3. If the content of the file is a process (an output equal to 0 means succesful), output a message, and exit the application.
    if [ $? -eq 0 ] then
        echo "Job is already running"
        exit 1
    else
        # 4. If the exit code was not succesful, we assume the process was not running, so we place the current process ID into the PID File
        echo $$ > $PIDFILE
        if [ $? -ne 0 ] then
        echo "Could not create PID file"
        exit 1
        fi
    fi
# C. If the PID file does not exist, it will attempt to create it, then run the code
else
    # 1. This outputs the current PID into the PID file:
    #  The '$$' value is a variable for the current PID.
    #  The '>' operand directs the output from echo to a file
    echo $$ > $PIDFILE

    # 2. If the exit code was not succesful, output an error message, and exit the application.
    if [ $? -ne 0 ]
    then
        echo "Could not create PID file"
        exit 1
    fi
fi

# *** In here you need to insert the original script code *** #

# D. Remove the PID file so we try to always have a "clean slate"
rm $PIDFILE

Autres solutions

En plus des deux alternatives ci-dessus, il existe différents utilitaires que vous pouvez implémenter.

Flocage

La commande flock est un utilitaire installé sur les nouvelles distributions Linux qui gère les verrous à partir de scripts shell

Vous pouvez vous référer à la documentation officielle à l'URL ci-dessous pour en savoir plus sur son utilisation :

  • https://manpages.ubuntu.com/manpages/xenial/man1/flock.1.html

La chose utile à propos de flock est que le verrou de fichier sera maintenu en place jusqu'à ce que le processus d'origine se termine, à ce moment-là, flock libérera le verrou de fichier. Cela est vrai que le processus se termine avec succès ou non.

Solo

Solo est un script Perl qui lie l'exécution du script à un port réseau au lieu d'un fichier,

Vous pouvez vous référer au site officiel pour obtenir plus d'informations :

  • https://www.timkay.com/solo/.

Semblable à d'autres implémentations, cela créera un verrou qui ne sera libéré qu'une fois le script attribué terminé :

$ ./solo -port=1234 /var/tmp/script.sh & 1234
$ ./solo -port=1234 /var/tmp/script.sh
solo(1234): Address already in use

L'avantage de lier un port au lieu d'un fichier est qu'un port ne peut pas être supprimé. Ce qui, avec d'autres implémentations, "libèrerait" le verrou existant, autorisant les instances dupliquées d'une tâche.

Remarques supplémentaires

Bien que les utilitaires et pratiques ci-dessus empêchent l'exécution de tâches en double, il est important de surveiller la façon dont vos tâches cron interagissent afin d'éviter les tâches qui se chevauchent ou l'utilisation excessive de ressources qui pourraient entraver les performances de notre appareil et de nos opérations.

Articles liés

  • Commande de troupeau
  • Script PERL solo.

Utilisez l'onglet Commentaires pour faire des commentaires ou poser des questions. Vous pouvez également démarrer une conversation avec nous.


Linux
  1. Encodage d'un fichier Zip ?

  2. La tâche Cron ne s'exécute pas ?

  3. Ma tâche Cron ne fonctionne pas

  4. Problème Crontab :la tâche Cron ne fonctionne pas lors de l'utilisation d'un pourcentage

  5. Comment mettre en place une tâche cron pour lancer un exécutable toutes les heures ?

Comment configurer une tâche Cron sous Linux

Comment planifier une tâche dans Cron pour qu'elle s'exécute toutes les heures dans Ubuntu 20.04

Comment mettre en place un Cron Job avec des caractères spéciaux chez Hostinger ?

Linux Crontab :15 exemples de tâches Cron impressionnants

Comment afficher une tâche cron en cours d'exécution ?

Vérifier qu'une tâche cron est terminée