Forum Programmation.shell Programmation script shell ksh unix

Posté par  .
Étiquettes : aucune
0
9
oct.
2009

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;
}
  • # exclure grep

    Posté par  . Évalué à 7.

    truc classique pour éviter le grep -vF "grep" :

    $ ps -edf|grep Eterm
    gab 7579 28182 0 14:47 ? 00:00:00 Eterm
    gab 7685 7580 0 14:50 pts/5 00:00:00 grep Eterm


    $ ps -edf |grep Eter[m]
    gab 7579 28182 0 14:47 ? 00:00:00 Eterm


    sinon, man pidof ?
    • [^] # Re: exclure grep

      Posté par  . Évalué à 1.

      Wahou... j'la connaissais pas celle là !
      Ça marche d'enfer ! Une seule question : comment est ce possib' ??!!
      Je vois pas pourquoi en rajoutant des crochets on arrive à supprimer le grep 0_ô.
      Si quelqu'un pouvait écrire une petite explication... Merci d'avance !
      (apparemment c'est un truc «classique»... honte à moi...)
      • [^] # Re: exclure grep

        Posté par  . Évalué à 2.

        les crochets sont interprétés par le shell avant d'être injectés dans grep, du coup, grep travaille bien sur ce que tu veux greper.
        par contre, ps affiche la ligne de commande telle qu'elle a été saisie (donc avec les crochets), qui, du coup, n'est pas matchée par le grep (pour lequel les crochets ont été interprétés par le shell).

        comme c'est pas très clair ce que je dis, voici l'exemple :
        $ps -edf |grep gre[p]
        gab 8436 7580 0 16:19 pts/5 00:00:00 grep gre[p]
        • [^] # Re: exclure grep

          Posté par  . Évalué à 4.

          Pas tout à fait : les crochets ne sont pas interprétés par le shell, mais font partie de la syntaxe des expressions régulières de grep. En l'occurence, gre[p] correspond au mot 'grep', comme gre[py] correspond aux mots grep ou grey. Ici les crochets évitent simplement à l'expression régulière d'être matchée dans les commandes de la liste des processus, puisque l'expression régulière n'est plus capable de se 'matcher' elle-même.
          • [^] # Re: exclure grep

            Posté par  . Évalué à 3.

            ah oui tiens, je vivais dans l'illusion sur ce point depuis quelques années !
            merci pour cette utile précision :)
          • [^] # Re: exclure grep

            Posté par  . Évalué à 5.

            ben vous pouvez avoir tous les deux raison !

            En fait le shell interprète bien les crochets et si dans le répertoire courant il existe un fichier grep, alors le shell qui va remplacer la chaîne gre[p] par grep et, à ce moment-là, les crochets ne servent plus à rien.

            Pour bien comprendre, voici un exemple :
            $ touch grep
            $ echo gre[p]
            grep
            $ ps -ef | grep gre[p]
            toto 19592 18514 0 17:47 pts/5 00:00:00 grep grep
            $ ps -ef | grep "gre[p]"
            jjdoti 19625 18514 0 17:51 pts/5 00:00:00 grep gre[p]
            $ rm grep
            $ echo gre[p]
            gre[p]
            $ ps -ef | grep gre[p]
            $ ps -ef | grep gre[p]
            toto 19601 18514 0 17:48 pts/5 00:00:00 grep gre[p]

            Moralité : il faut mettre des quottes autour du motif à passer à grep.

            A+
            JJD
            • [^] # Re: exclure grep

              Posté par  . Évalué à 2.

              et la lumière fût.
              Merci !
            • [^] # Re: exclure grep

              Posté par  . Évalué à -1.

              Attention, c'est pas portable car spécifique à bash.

              Bash :
              $ ps aux | grep gre[p]
              xxx 2892 0.0 0.1 3476 804 pts/0 R+ 13:33 0:00 grep gre[p]
              $

              Dash (shell minimal posix) :
              $ ps aux | grep gre[p]
              $

              Zsh :
              $ ps aux PG gre[p]
              zsh: no matches found: gre[p]
              $
    • [^] # Re: exclure grep

      Posté par  (site web personnel) . Évalué à 2.

      $ ps -edf |grep Eter[m]
      zsh: no matches found Eter[m]


      Le comportement de bash quand les expansions n'existent pas est pour moi une source d'erreur : ça rend des scripts imprévisibles suivant les fichiers présents.

      $ ps -edf | grep 'Eter[m]'
      manu 8151 2373 27 18:16 pts/0 00:11:15 Eterm

      Je lui dis explicitement que les quotes doivent pas être expansés et passés tels quels à grep (j'aurais aussi pu utiliser noglob).
  • # tout ça pour ça :)

    Posté par  (site web personnel) . Évalué à 2.

    comme indiqué par gaaaaaAab, tu ente de réinventer pidof.

    Seulement pidof est dispo sur GNU/linux mais pas sur d'autres unix comme *BSD.
    Et comme tu fais du KSH, j'ai dans l'idée que t'es sur Unix proprio ou *BSD.

    je ferais plutôt:

    if [ $(pgrep -x process | wc -l) -gt 1 ]; then
    echo coincoin
    fi

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.