v
Le
denist
Bonjour,
J'ai quelques scripts que j'ai bricolés, lancés via cron.
J'aimerais ajouter à une vérification, si le script est déjà lancé, ça
quitte silencieusement. Comme certaines étapes du script sont longues
(compressions de données par exemple), je souhaite éviter que la tâche
cron suivante ne relance le même script si le précédent est toujours en
cours.
Merci d'avance
J'ai quelques scripts que j'ai bricolés, lancés via cron.
J'aimerais ajouter à une vérification, si le script est déjà lancé, ça
quitte silencieusement. Comme certaines étapes du script sont longues
(compressions de données par exemple), je souhaite éviter que la tâche
cron suivante ne relance le même script si le précédent est toujours en
cours.
Merci d'avance

Poser une question


Le 04/04/2011 16:11, denist a écrit :
As-tu essayé avec la commande ps ?
Cordialement,
--
Olivier Miakinen
Bonjour
Oui j'y ai pensé, voici mon essai. Ça semble fonctionner mais je ne sais
pas si c'est propre. Je pensais qu'il y avait une commande prévue.
#!/bin/bash
#/usr/local/bin/mon_script
$SCRIPT=mon_script
ps auwx | grep -v grep | grep $SCRIPT >/dev/null
if [ "$?" = "0" ]
then
echo -e "Au moins un processus est déjà lancé."
else
echo -e "Lancement..."
[le reste du script]
fi
Yop yop,
Non, c'est pas propre. La commande prévue pour ce genre de trucs est
lockf(1) sur un BSD ou flock(1) sur un linux. Je ne sais pas s'il y a
une version posix de ces utilitaires.
Regarder le man pour savoir comment ça s'utilise. Il faut juste faire
attention quand on tue le script qui utilise ces commandes et de virer
le fichier de lock, sinon le risque que le script ne se relance jamais
est assez élevé (ne me demandez pas comment je le sais).
cdlt,
pour ce genre de besoin, j'utilise l'approche suivante
progname="<nom du script ici>"
piddir=/var/tmp # la coutume est d'utiliser /var/run
# mais faut être root
pidfile=$piddir/$progname # va contenir le PID du script en exécution
# noter que le "kill -0" n'est pas "destructeur"
if -f $pidfile && kill -0 $(<$pidfile) ; then
# on a détecté que le script s'exécute,
echo >&2 "$progname "déja lancé - abort"
# (supprimer la ligne ci dessous pour quitter "silencieusement")
exit 1
fi
# la voie est libre
echo "$$" >$pidfile # d'abord s'enregistrer
# destruction automatique du fichier à la fin
trap "rm -f $pidfile" EXIT
# la partie "utile" du script vient ci-dessous
--> vérifier que la syntaxe $(<pidfile) marche en bash (j'ai plutôt l'habitude
du korn), et sinon, remplacer par `cat $pidfile`.
--
Gilles Pion
<snip>
Oui, mais non. Globalement, ça marche, mais comme la vérification et
la pose du lock n'est pas atomique, si les deux programmes sont lancés
en même temps il est possible de lancer deux fois le programme
simultanément (en gros quand les deux programmes vont regarder que le
fichiers existe avant que l'un ou l'autre ne le créé).
Et comme la loi de Brown[1] dit que si ça peut pêter, alors ça va
pêter, je déconseille fortement de faire ça, même si la plupart du
temps ça marche. La même loi dit que quand ça va pêter, ça va être au
pire moment...
[1] Brown, c'est le type qui disait que Murphy était optimiste...