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.