IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation et administration système Perl Discussion :

résultat commande dans un tableau


Sujet :

Programmation et administration système Perl

  1. #1
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2008
    Messages : 47
    Par défaut résultat commande dans un tableau
    Bonjour,

    Pour des besoins de supervisions avec nagios sur HP-UX, j'ai dû me mettre au Perl ce matin même (je n'y ai jamais touché avant).

    J'ai pu commencer mon script en cherchant beaucoup sur la toile par-ci par-là, mais je me heurte maintenant à un problème que je ne comprends pas trop.

    Pour expliquer le contexte, j'ai besoin de comparer les valeurs d'utilisation des deux swap de mon serveur à des valeurs qui seront passées en paramètres (pour définir les seuils critiques et warning). J'ai donc besoin de récupérer les résultats des deux commandes "swapinfo" et de les mettre chacun dans un tableau pour pouvoir les traiter par la suite. C'est là où je me suis arrêté pour le moment.

    Voici ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    #!/opt/perl/bin/perl
    #
    # check multiswap hpux
    #
    use strict;
    use Getopt::Std;
    use vars qw(@swap1 @swap2 $command_line1 $command_line2 %exit_codes);
     
    # Codes préféfinis pour Nagios
    %exit_codes  = ('UNKNOWN',-1,
                    'OK',0,
                    'WARNING',1,
                    'CRITICAL',2);
     
    # Récupérer les infos du swap1 en /dev/vg00/lvol2
    $command_line1 = `swapinfo -tam | grep lvol2`;
     
     
    # Récupérer les infos du swap2 en /dev/vg00/lvol9
    $command_line2 = `swapinfo -tam | grep lvol9`;
     
    # Mettre le résultat dans un tableau pour swap1
    chomp $command_line1;
    @swap1 = split(/ /,$command_line1);
     
    # Mettre le résultat dans un tableau pour swap2
    chomp $command_line2;
    @swap2 = split(/ /, $command_line2);
    Avec la commande "swapinfo -tam", j'ai noté que, par exemple, la 3e colonne (en partant de 0) donne le nombre de Mb libre, et que la 4e colonne donne le pourcentage utilisé.
    Ainsi, pour vérifier que je pouvais bien utiliser les valeurs du tableau par la suite, j'ai essayé de les lire, en rajoutant, à la fin du script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    print $swap1[3],"\n";
    print $swap1[4],"\n";
    print $swap2[3],"\n";
    print $swap2[4],"\n";
    Et à l'exécution, rien ne s'affiche...

    Après plusieurs essais, je me suis aperçu que seul

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    print $swap1[0],"\n";
    print $swap2[0],"\n";
    m'affichait effectivement ce que j'avais demandé. Dès que j'essaye d'afficher les colonnes suivantes, rien.

    Je débute donc j'ai forcément loupé quelque chose mais je ne sais pas quoi, pouvez-vous m'aider ?

    Merci d'avance !

  2. #2
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    Salut !

    split /\t/ répondra mieux au problème à mon avis, car si le résultat est renvoyé en colonnes, il y a fort à parier qu'il s'agit de tabulations, et non d'espaces.

    @+
    Mr6

  3. #3
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2008
    Messages : 47
    Par défaut
    Salut !

    Je viens d'essayer ta solution dans mon script mais, pour
    , tout le résultat de ma commande est affiché (toutes les colonnes), et pour , à nouveau rien n'est affiché...

    En complément, il s'agit en effet à la base de tabulations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    swapinfo -tam | grep lvol2
    affiche

    Une autre idée ?

  4. #4
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    alors dans le doute \s au lieu de \t
    C'est moins propre à mon gout mais ca prendre tout type d'espace

    @+
    Mr6

  5. #5
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2008
    Messages : 47
    Par défaut
    arf... le résultat est le même qu'au départ :
    affiche bien la 1ere colonne, soit "dev", puis
    n'affiche rien (une ligne vide) :
    root:/opt/nrpe/scripts#./check_multiswap.pl
    dev

    root:/opt/nrpe/scripts#

  6. #6
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    lol ! compris !

    Rajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $commande_line1 =~ s/\s\s/\s/g
    Pour enlever les espaces en trop avant de découper dessus

    @+
    Mr6

  7. #7
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2008
    Messages : 47
    Par défaut
    euhhhh je le rajoute où ? comme ça ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $command_line1 = `swapinfo -tam | grep lvol2`;
    $command_line1 =~ s/\s\s/\s/g;
     
    chomp $command_line1;
    @swap1 = split(/\s/,$command_line1);
     
    print $swap1[0],"\n";
    print $swap1[1],"\n";
    Cette fois, ça me donne :

    root:/opt/nrpe/scripts#./check_multiswap.pl
    devssss5120ss
    115ss5005ss2%sss
    root:/opt/nrpe/scripts#
    Comme je suis débutant, tu pourrais m'expliquer à quoi correspond la ligne que tu m'as donnée ?

  8. #8
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    C'est la commande de substitution, en l'occurence on lui demande de remplacer 2 espaces ( de tout type) par 1 seul, le flag /g permettant de répéter cette opération sur tout le contenu (sinon il s'arrêterait à la 1ère occurence trouvée).

    Par contre tu as du oublier un antislash dans la ligne car on ne devrait pas voir tous ces "s" trainer...

    @+
    Mr6

  9. #9
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2008
    Messages : 47
    Par défaut
    Ben...j'ai fait un copier/coller de la commande que tu m'as donnée... mais je vais essayer de trouver où le rajouter cet antislash manquant, il faut bien que je travaille un peu aussi ! ^^

  10. #10
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    bizarre....
    bon, du coup je me suis noyé moi, ca aurait peut-etre tout simplement été plus simple de faire un split /\s+/ je crois à la place de la substitution -_-"

  11. #11
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2008
    Messages : 47
    Par défaut
    Nickel ! Bravo, ça fonctionne !

    Effectivement, c'est plus simple comme ça ^^

    Pour ma connaissance, quelle est la fonction du "+" après le "s" ?

    Merci en tout cas, je vais pouvoir continuer mon script !

  12. #12
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    Le + sert à dire "un élément requis, plusieurs autorisés". Dans notre cas on prend les \s supplémentaires s'il y en a, on joue en fait sur un effet de gourmandise de l'opérateur

    @+
    Mr6

  13. #13
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2008
    Messages : 47
    Par défaut
    OK un grand merci car mon script fonctionne à merveille maintenant

    J'ai encore juste une petite question, mais c'est facultatif pour moi :

    En fait, sur les différents serveurs, le swap 1 est toujours situé sur "lvol2", donc c'est ok. Par contre, le swap 2 change. Pour celui sur lequel j'ai travaillé là, c'était "lvol9", mais sur un autre c'est "lvol10" par exemple.

    La question que je me pose, c'est est-ce qu'il est possible de faire pour que le script détecte le nom du "lvol" automatiquement.

    Par exemple qu'il analyse le résultat de la commande "swapinfo", qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    root:/opt/nrpe/scripts#swapinfo
                 Kb      Kb      Kb   PCT  START/      Kb
    TYPE      AVAIL    USED    FREE  USED   LIMIT RESERVE  PRI  NAME
    dev     5242880  117376 5125504    2%       0       -    1  /dev/vg00/lvol2
    dev     5242880  115800 5127080    2%       0       -    1  /dev/vg00/lvol10
    reserve       - 2150136 -2150136
    memory  4079680 1891784 2187896   46%
    et qu'il dise
    • Pour la 1e ligne qui commence par "dev", c'est "lvol2"
    • Pour la 2e ligne qui commence par "dev", c'est "lvol10"

    ...ou quelque chose du genre...

    Ensuite il le mettrai dans une variable $Name1 et $Name2 par exemple pour la suite du script.

    Bon, il n'y a pas beaucoup de serveurs qui fonctionnent en multiswap donc ça ne me dérange pas de le changer à la main sur chacun d'eux, mais ça permettrait à ceux qui reprendront mon boulot de ne pas devoir modifier plein de trucs dans les scripts...

    Est-ce que c'est faisable ?

  14. #14
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    ceci devrait faire l'affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    swapinfo | perl -F\s+ -lane 'next unless /dev/; print "$F[$#F] $F[1] $F[2] $F[3] $F[4]"'
    .....

    j'avais oublié que c'etait pour faire un check nagios....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    open FH, "swapinfo |" or die "probleme executer swapinfo :$!\n";
    foreach (grep { /dev/} <FH>) { 
      my @infos = split /\s+/;
      print "$infos[$#infos] : @infos\n";
    }
    Ca devrait faire l'affaire.

    @+
    Mr6

  15. #15
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2008
    Messages : 47
    Par défaut
    merci pour ces bouts de code ! je vais essayer de comprendre tout ça dans un premier temps et de les placer au bon endroit et d'adapter tout ça...

  16. #16
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2008
    Messages : 47
    Par défaut
    bon alors, j'ai tout d'abord testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    swapinfo | perl -F\s+ -lane 'next unless /dev/; print "$F[$#F] $F[1] $F[2] $F[3] $F[4]"'
    qui me renvoie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dev     5242880  117376 5125504    2%       0       -    1  /dev/vg00/lvol2
    dev     5242880  115800 5127080    2%       0       -    1  /dev/vg00/lvol9
    En essayant de supprimer certains élément je me suis rendu compte que la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    swapinfo | perl -F\s+ -lane 'next unless /dev/; print "$F[$#F]"'
    me renvoie exactement le même résultat. A quoi sert donc les "$F[1] $F[2] $F[3] $F[4]" ? Peux-tu aussi m'expliquer à partir du "perl -F\s+ -lane" ? J'avoue que j'ai un peu du mal à suivre

    Pour la suite, je comprends certains bout, mais pas tout. En gros, dis moi si c'est juste ou faux, ça mets le résultat de la commande "swapinfo" précédente dans un fichier nommé FH et ça fait un boucle sur chaque ligne où il y a "dev" dans ce fichier, pour mettre chaque ligne dans un tableau nommé "infos" et ça écrit...quelque chose du tableau que je sais pas ^^

  17. #17
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    Normalement $F[$#F] ne contient que le dernier élément du tableau @F. Ce tableau est constitué à la volée à partir du retour de la commande swapinfo, et ce grâce au flag "a" (autosplit) de perl -F\s+ -lane. Le paramètre -F\s+ sert à dire que je split avec le paramètre \s+ pour remplir le tableau F.
    Par contre si l'autosplit ne marche pas... ca veut peut-etre dire que le séparateur n'est pas encore au point quand on le récupère de cette façon... Je te laisse chercher ce point là, bien que dans l'absolu ce qui compte c'est le 2ème bout de code
    Ce deuxième bout de code faisant la même chose que le 1er

    @+
    Mr6

  18. #18
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2008
    Messages : 47
    Par défaut
    ahhhh d'accord, donc tu m'as donné 2 façons de faire la même chose

    Par contre, euh avant j'avais testé directement la commande "swapinfo | perl -F..." en ligne de commande, mais maintenant je l'ai mise dans mon scipt.pl et ça me renvoie
    Unrecognized file test: -F at ./testspec.pl line 16.
    pourtant tu viens de me dire que le F était un tableau, du coup je ne comprends pas trop

  19. #19
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2008
    Messages : 47
    Par défaut
    Finalement c'est pas grave pour l'erreur, j'ai choisi l'autre méthode.

    Par contre, là, dans le tableau "infos", j'ai le résultat de la commande swapinfo uniquement dans la boucle.

    Est-ce que ce serait possible de donner un numéro de tableau, et à chaque passage de la boucle d'incrémenter ce numéro ? Ainsi, au 1er passage, ça mettrai le résultat dans le tableau "infos1", puis au 2e passage dans le tableau "infos2"... pour que je puisse réutiliser les 2 tableaux indépendamment l'un de l'autre en dehors de la boucle dans la suite.

    Je pensais à un truc du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    my i=0;
    my @infos[i];
    open FH, "swapinfo |" or die "probleme executer swapinfo :$!\n";
    foreach (grep { /dev/} <FH>) {
      @infos[i] = split /\s+/;
      print "@infos[i]\n";
      $i++;
    }
    mais bon je sais pas si c'est possible (en tout cas ça marche pas ^^)

    merci pour ton aide

  20. #20
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    Ha ben non, si c'est en ligne de commande c'est pas fait pour etre mis dans un script

    Bref, revenons à nos moutons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    my %infos_hash;
    open FH, "swapinfo |" or die "probleme executer swapinfo :$!\n";
    foreach (grep { /dev/} <FH>) {
      my @infos = split /\s+/;
      $infos_hash{$infos[$#infos]} = @infos;
    }
    
    foreach my $id (keys (%info_hash)) {
      print "device $id : details $info_hash{$id}\n"; #je ne sais plus si ca renvoie la reference ou le contenu du tableau...
      print "device $id : details $info_hash{$id}->[1]\n"; #par exemple
    }
    C'est pas plus mal d'enregistrer par device, non ?

    @+
    Mr6

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. mettre contenue d'une commande dans un tableau
    Par parisien91 dans le forum Langage
    Réponses: 8
    Dernier message: 09/02/2009, 10h27
  2. [MySQL] Affichage de résultats SQL dans un tableau
    Par illight dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 14/02/2007, 09h24
  3. [SQL] Affichage résultat requête dans un tableau, bouton affichage page
    Par megapacman dans le forum PHP & Base de données
    Réponses: 35
    Dernier message: 18/05/2006, 16h42
  4. Réponses: 1
    Dernier message: 01/05/2006, 11h17
  5. [VB]résultat requête dans un tableau
    Par blaiso dans le forum VB 6 et antérieur
    Réponses: 29
    Dernier message: 30/01/2006, 16h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo