lundi 25 janvier 2016

Linux, pidof pour vérifier qu'un script n'est pas en train de s'exécuter avant d'en lancer une nouvelle instance

Il arrive parfois que plusieurs instances du même programme ne doivent pas être exécutées simultanément. Par exemple pour assurer l'intégrité des ressources utilisées.
Dans ce cas, il est indispensable au démarrage du programme de vérifier qu'une autre instance n'est pas déjà en cours d'exécution.

Dans le cas de scripts bash très utiles pour automatiser certaines tâches il existe une solution simple et fiable : utiliser la commande pidof.

De façon générale la commande pidof nomprocess sert à retrouver les identifiants de tous les process portant le nom nomprocess.

Par défaut, cette commande ne prend pas en compte les scripts shell.
Pour corriger cela, il faut lui ajouter l'option -x de la façon suivante : pidof -x nomscript

Si dans le script nommé monscript j'utilise pidof -x monscript je vais bien récupérer les identifiants des éventuelles autres instances de monscript mais aussi celui de l'instance courante.
L'option -o identifiant_à_omettre permet de remédier à cela. En effet, cette option indique à pidof de ne pas retourner l'identifiant identifiant_à_omettre.
Sous bash, la variable $$ contient l'identifiant du script courant.
Donc, la commande pidof -x -o $$ monscript renvoie bien les identifiants de toutes les instances de monscript sauf celui de l'instance courante.

Pour être sûr que plusieurs instances de monscript ne soient pas exécutées en même temps, celui ci peut donc être écrit de la façon suivante :

#!/bin/bash
# dum verifie qu'il n'y a pas d'autres instances du script en cours d'execution
dum=$(pidof -x -o $$ monscript)
if test -z "$dum"
then
   actions à effectuer
fi

Aucun commentaire:

Enregistrer un commentaire