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 !
#1 par Vincent à 31 juillet 2018 - 11 h 44 min
Citation
En voyant le code je me suis dit tiens tiens, ce serait plus propre avec un sémaphore, et j’ai trouvé cette réponse :
https://stackoverflow.com/a/10197327/9568489
TL;DR Utiliser ‘mkdir’ (opération atomique) pour créer des verrous semble être une bonne pratique en bash 🙂
Bises !