Programmation script shell ksh unix

Programmation script shell ksh unix - Shell/Batch - Programmation

Marsh Posté le 09-10-2009 à 13:33:58    

Bonjour à tous,
 
Je développe une fonction pour un script shell sous ksh qui doit me renvoyer le nombre d'instances du programme principal en cours de traitement, et s'arrêter si ce nombre est supérieur à 1.
 
Relativement simple, pensai-je.
 
Seulement voilà, les résultats que j'obtiens sont différents de ce que je suis en droit d'attendre. Le nombre de processus que j'obtiens en résultat est souvent supérieur ou inférieur.
 
J'ai probablement dû me tromper quelque part, mais impossible de trouver où est mon erreur !
 
Même en appelant deux fois mon calcul, je n'ai pas deux fois le même résultat !
 
Toute aide est la bienvenue !
 
Mon code :
 
 
function NombreDeProcessus
{
PROCESSUS=$1 ;
VAL_1=`ps -eo args | grep -F "${PROCESSUS}" | grep -vF "grep" | wc -l | tr -d [:blank:]`;
VAL_2=$(ps -eo args | grep -F "${PROCESSUS}" | grep -vF "grep" | wc -l | tr -d [:blank:]);
echo "Valeur 1 : '$VAL_1'" ;
echo "Valeur 2 : '$VAL_2'" ;
return $VAL_2;
}

Reply

Marsh Posté le 09-10-2009 à 13:33:58   

Reply

Marsh Posté le 09-10-2009 à 18:03:09    

Gourou Dsecours a écrit :

Bonjour à tous,
 
Je développe une fonction pour un script shell sous ksh qui doit me renvoyer le nombre d'instances du programme principal en cours de traitement, et s'arrêter si ce nombre est supérieur à 1.
 
Relativement simple, pensai-je.
 
Seulement voilà, les résultats que j'obtiens sont différents de ce que je suis en droit d'attendre. Le nombre de processus que j'obtiens en résultat est souvent supérieur ou inférieur.
 
J'ai probablement dû me tromper quelque part, mais impossible de trouver où est mon erreur !
 
Même en appelant deux fois mon calcul, je n'ai pas deux fois le même résultat !
 
Toute aide est la bienvenue !
 
Mon code :
 
 
function NombreDeProcessus
{
PROCESSUS=$1 ;
VAL_1=`ps -eo args | grep -F "${PROCESSUS}" | grep -vF "grep" | wc -l | tr -d [:blank:]`;
VAL_2=$(ps -eo args | grep -F "${PROCESSUS}" | grep -vF "grep" | wc -l | tr -d [:blank:]);
echo "Valeur 1 : '$VAL_1'" ;
echo "Valeur 2 : '$VAL_2'" ;
return $VAL_2;
}


 
Bon, grosse erreur: tu utilises le return comme un retour de valeur or, ce n'est pas fait pour ça. Un return dans une fonction renvoie son état. Bien sûr, ça marche dans ton cas car la valeur ne dépasse probablement pas 255 mais voilà quoi.
 
Le renvoi d'une valeur par une fonction doit se faire via un affichage. Et l'appelant récupère la valeur avec le mécanisme des backquottes ou du $()
Ex:

Code :
  1. #!/bin/sh
  2. carre()
  3. {
  4.     expr $1 \* $1
  5. }
  6. a=$(carre 5)
  7. echo "le carré de 5 est $a"


 
Sinon je ne vois pas ce qui peut clocher. Sauf que je ne sais pas ce que fait "ps -eo args".
Ptet tu pourrais décomposer les résultats avec des logs. loguer le résultat du ps quoi...
 
Au fait, c'est quoi $1 dans ta fonction ? Le nom du script passé en paramètre ? Ben tu l'as déjà dans $0 donc c'est pas la peine de le passer...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 09-10-2009 à 19:01:32    

Merci pour le conseil sur le "return", je ne le savais pas.
 
$1 dans la fonction est effectivement le nom du script passé en paramètre, je voulais le passer pour me réserver la possibilité de faire une fonction générique.
 
ps -eo args n'affiche que le nom des processus, sans tous les flags d'information, mais ça n'a pas réellement d'importance.
Le résultat serait strictement le même avec un ps -ef classique.

Reply

Marsh Posté le 10-10-2009 à 16:45:59    

Gourou Dsecours a écrit :


ps -eo args n'affiche que le nom des processus, sans tous les flags d'information, mais ça n'a pas réellement d'importance.
Le résultat serait strictement le même avec un ps -ef classique.


 
Ok - J'ai lancé plusieurs fois ta fonction et effectivement, les valeurs affichées semblent totalement bidon. Mais en décomposant chaque commande, je n'ai rien trouvé qui clochait (sauf peut-être le tr que je trouve inutile dans ce cas)
 
Toutefois, comme tu fais un ps | grep t'as le grep qui apparait dans les processus ce qui t'oblige à le filtrer via un autre grep. Perso, j'ai développé mon propre code qui diffère un peu du tien car j'isole le ps d'un coté avant de le filtrer via grep => total: le grep n'apparait pas et je n'ai pas besoin de le filtrer

Code :
  1. #!/bin/sh
  2. fproc()
  3. {
  4.     PROCESSUS=$1
  5.     ps=`ps -eo args`
  6.     nb=`echo "$ps" |grep -F "$PROCESSUS" |wc -l`
  7.     echo $nb
  8. }


 
Et là, ça semble plus cohérent. J'ai lancé le script en parallèle dans 2 fenêtres et j'ai bien eu "2" comme résultat.


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 10-10-2009 à 16:59:18    


Bien vu, le coup de la décomposition !
 
J'avais résolu le problème entre-temps avec un AWK qui comptait les lignes et renvoyait le résultat, mais ta solution est plus légère et plus simple.
 
Merci !
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed