Bonjour,

En essayant de faire un script que je supposais très simple, je me suis retrouvé confronté à un problème délicat.

L'objectif de mon script est relativement simple : il doit lancer un programme mais doit vérifier avant qu'il n'y a pas déjà un script qui l'a lancé.

A coup de ps et de grep et en redirigeant le tout vers wc, je cherche donc à récupérer le nombre de script du même nom tournant actuellement. Si ce nombre est à 1 c'est que le script courant est le seul à tourner et je peux donc exécuter mon programme. Si ce nombre est différent de 1, c'est qu'il y en a déjà un autre qui tourne et je quitte sans rien faire.

Le code de mon script (que nous appellerons "scriptExemple.sh") est donc le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
#!/bin/sh
n=`ps -ef | grep -v grep | grep scriptExemple.sh | wc -l`
if [ $n -eq "1" ] ; then
   echo Je lance mon programme
else
   echo Le programme tourne deja
fi
Seulement ce script ne marche pas car ps (?) fait parfois un "fork" de mon script ce qui fait que wc retourne une valeur erronée.

On se rend compte de ce phénomène en effectuant ce petit script (toto.sh) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
#!/bin/sh
 
while true ; do
        ps -ef f | grep toto | grep -v grep
        echo
done
En exécutant ce script quelques secondes, j'obtient le résultat suivant :
./toto.sh
root 15555 15361 0 14:33 pts/5 S+ 0:00 | \_ /bin/sh ./toto.sh

root 15555 15361 0 14:33 pts/5 R+ 0:00 | \_ /bin/sh ./toto.sh
root 15564 15555 0 14:33 pts/5 R+ 0:00 | \_ /bin/sh ./toto.sh
On constate donc que parfois tout se passe bien (la première ligne) et parfois ps crée un script fils du même nom.

Bref, à mon grand malheur, mon petit script tout simple ne me permet pas de récupérer le nombre exact de scripts du même nom tournant en même temps.

Auriez-vous une explication sur ce phénomène et, encore mieux, une solution pour mon petit script (une solution simple serait de créer un fichier de verrouillage et de la supprimer, sa présence me signalerait donc s'il y a déjà un script qui tourne ou non).