Voici un petit script bash à inclure dans votre script si vous souhaitez qu’il ne soit lancé qu’une seule fois. Je l’ai fait à La Rache dans le but qu’un rsync ne se lance pas plusieurs fois.

Vous pouvez l’inclure par un simple :

. /usr/local/bin/run_once.sh

 

/usr/local/bin/run_once.sh

#!/bin/sh
SCRIPTNAME=`basename $0`
export LOCKSYNC="/var/run/$SCRIPTNAME.lock"
PID=$$
echo "["`date +"%Y/%m/%d %H:%M:%S"`"] Demarrage du script $0"
if [ -f "$LOCKSYNC" ]
then
echo "Fichier lock "$LOCKSYNC" present. Deja en cours ?"
PIDLOCK=`cat $LOCKSYNC`
if [ -f /proc/$PIDLOCK/exe ]
then
echo "Le process semble etre toujours en cours. Lancement de $SCRIPTNAME impossible."
exit
else
echo "Le process ne semble plus etre en cours, Lancement de $SCRIPTNAME"
rm $LOCKSYNC
fi
fi
echo "Creation du lock "$LOCKSYNC
echo $PID > $LOCKSYNC

Pour le fonctionnement, il va créer un fichier lock correspondant au nom du script qui indiquera si le programme est déjà lancé ou non. Si le lock est présent, le script va également vérifier que le processus est toujours actif.

Je m’en sers dans la machine proxy transparent qui sert de dépôt locaux lors de nos install party. Cela est particulièrement utile car nous sommes plusieurs admins sur la machine en question.

Et joyeuses fêtes !