Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1052 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Programmation script shell ksh unix

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Programmation script shell ksh unix

n°1930624
Gourou Dse​cours
Posté le 09-10-2009 à 13:33:58  profilanswer
 

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;
}

mood
Publicité
Posté le 09-10-2009 à 13:33:58  profilanswer
 

n°1930755
Sve@r
Posté le 09-10-2009 à 18:03:09  profilanswer
 

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.
n°1930769
Gourou Dse​cours
Posté le 09-10-2009 à 19:01:32  profilanswer
 

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.

n°1930869
Sve@r
Posté le 10-10-2009 à 16:45:59  profilanswer
 

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.
n°1930870
Gourou Dse​cours
Posté le 10-10-2009 à 16:59:18  profilanswer
 


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 !
 
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Programmation script shell ksh unix

 

Sujets relatifs
Prendre la valeur après un pingaide script PHP/SQLITE
[Javascript] Aide pour adapter un script - [Résolu]modification script php/mysql
réference à des cellules script lotus123Problème dans la rédaction d'un petit script
Connecter à la base WMI en tant que, ou "élever" le script en tant que[VBS] script pour copier un fichier de serveur vers un client
[Shell/Batch] "cat" à partir d'une ligne précise ... 
Plus de sujets relatifs à : Programmation script shell ksh unix


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR