Bonjour,
voici mon problème. Un traitement est planifié par crontab pour se déclencher à 12h00 et 17h00 tous les jours.
En début de traitement, on effectue un test pour savoir si une autre instance de ce même traitement ne serait pas déjà en train de tourner.
Si c'est le cas, le traitement en cours s'arrête.
Par exemple, le traitement s'appelle "traitement_planifie.sh".
Le traitement de 17h00 se déclenche.
On regarde s'il n'y a pas un process "traitement_planifie.sh" qui serait toujours actif.
Le test actuel fonctionne correctement ... sauf quand il plante
C'est à dire que parfois (et c'est rare !) le test détecte une autre instance du traitement alors que ce n'est pas le cas.
J'en arrive à croire que les fausses alertes sont dues au test lui-même
Voici le shell en question avec le test (supposé) bancal :
### shell : traitement_planifie.sh ######################
#!/usr/bin/sh
ps -fu usr2
sleep 2;
cd $DIR_SH;
pid=$$;
other_process=`ps -ef | grep \`basename $0\` | grep \`whoami\` | grep -v grep | grep -sv $pid | grep -v "/usr/bin/sh" | cut -c10-14 | wc -l`;
if [ $other_process -gt 0 ]
then
echo "Traitement déjà en cours sur ce serveur. Veuillez réessayer ultérieurement.";
exit -1;
fi
perl traitements_planifies.pl
####################################
"usr2" est le compte utilisé pour lancer le traitement.
le "ps -fu usr2" n'est donc là qu'à des fins de logs.
Le test cherche donc les process :
* qui se nomment traitement_planifie.sh
* qui sont lancés par usr2
* qui ne sont pas un grep
* qui ne sont pas le traitement en cours (cf le $pid=$$)
* qui ne sont pas lancés depuis /usr/bin/sh
J'en arrive aux points où vous intervenez
1/ voyez vous ce qui cloche dans le test ?
Je ne comprends pas pourquoi il lui arrive de ne pas fonctionner.
Un collègue m'a parlé de forks entre tous les greps qui feraient que le résultat de la commande finale ne serait pas toujours le même.
(Si j'ai écrit une grosse connerie, c'est normal, j'ai rien pigé )
2/ comment bien détecter si le traitement tourne déjà ?
Je cherche une solution basée sur l'analyse des process. Par exemple, l'analyse de la log générée par le traitement ne va pas car je ne peux me baser ni sur la date du fichier de log ni sur son contenu
Merci à tous ceux qui auront lu mon (très long) post.
Double merci à tous ceux qui y répondront.
Mille mercis à celui qui m'éclairera de sa lumière divine. Que son nom soit sanctifié. Je m'incline devant lui et lui baise les pieds
Partager