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 :
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.
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
On se rend compte de ce phénomène en effectuant ce petit script (toto.sh) :
En exécutant ce script quelques secondes, j'obtient le résultat suivant :
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
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../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
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).
Partager