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

Shell et commandes GNU Discussion :

Pb flush avec "boucle infinie" et pipe


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 30
    Points : 33
    Points
    33
    Par défaut Pb flush avec "boucle infinie" et pipe
    Bonjour,

    Je veux faire une sorte de monitoring de la heap Java d'un processus Java. Pour cela j'ai écrit la commande suivante qui ne marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    "$JAVA_HOME"/bin/jstat -gc $pid 10s | sed 's/ \+/,/g' >"$TMPDIR/JiniLus_${pid}_heap.csv" &
    #
    J'ai déjà modifié mon script pour le faire fonctionner autrement, mais j'avoue que je ne comprends pas pourquoi cette ligne ne fonctionne pas, et j'aime bien comprendre ce que je fais. C'est pourquoi je m'adresse à votre sagacité.

    J'ai effectué quelques tests pour "isoler" le problème et voici les résultats étranges (pour moi) que j'ai obtenus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #1 Ceci fonctionne
    while true; do echo aaa; sleep 1; done | tr a b
     
    #1 Ceci fonctionne
    while true; do echo aaa; done | tr a b | cat
     
    #3 Ceci ne fonctionne pas (semble bloqué)
    while true; do echo aaa; sleep 1; done | tr a b | cat
     
    #4 Ceci ne fonctionne pas mais fic est rempli
    while true; do echo aaa; sleep 1; done | tee fic | tr a b | cat
    #
    Je précise que j'ai essayé ces commandes sur cygwin+bash et ubuntu+dash.

    Vous avez une idée ?

  2. #2
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 30
    Points : 33
    Points
    33
    Par défaut
    J'ai eu une idée lumineuse :-) Mais cela ne résout pas vraiment mon problème.

    J'ai remplacer "aaa" par une chaine de longueur 500 ou plus. Là j'ai observé qu'en fait tout fonctionnait... ça fonctionne différemment mais ça fonctionne.

    Donc ce que j'ai décrit là haut est un problème de flush. Mais c'est un vrai problème pour moi. J'arrête le monitoring en faisant un kill -9 (pas gentil) donc il est important que les entrées-sorties standards soient correctement flushés au fur et à mesure.

    Quelqu'un a une idée pour pour gérer cela correctement ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 30
    Points : 33
    Points
    33
    Par défaut
    Bon... Finalement j'aurai trouvé la réponse tout seul.

    Je ne sais pas corriger le "tr", mais c'est un sed que je voulais corrigé initialement, donc tout va très bien

    Pour le sed, il existe une option :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
           -u, --unbuffered
     
                  load  minimal amounts of data from the input files and flush the
                  output buffers more often
    #
    #
    J'espère que ma question aidera d'autres personnes.

    Cyril.

  4. #4
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Bonjour,

    Je n'ai pas de temps en ce moment, mais je n'ai pu m'empêcher de faire deux petits tests:
    Premier...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in "1" "2" "3"; do echo a; sleep 1; done | tr a b
    Ici, j'ai bien les trois sorties à une seconde d'intervalle.
    Second...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in "1" "2" "3"; do echo a; sleep 1; done | tr a b | cat
    Maintenant, la sortie se fait en une seule fois, au bout de trois secondes. Il s'agit donc bien d'un problème de "vidange de mémoire tampon", ce qui donne des comportements pour le moins déconcertants. À suivre...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme avec une boucle infinie
    Par hunter99 dans le forum C++
    Réponses: 3
    Dernier message: 26/12/2007, 23h37
  2. problème avec les boucle infinies
    Par manciaux dans le forum C
    Réponses: 3
    Dernier message: 14/05/2007, 12h16
  3. [JMeter] Problème avec la boucle infinie pour les tests
    Par zegreg dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 05/10/2005, 11h41

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