Forum Programmation.shell Récupérer flux de données

Posté par .
Tags : aucun
1
30
nov.
2011

Bonjour à tous,

Je souhaiterai rediriger un flux de données vers un fichier texte.
La commande est la suivante : "dsp-load" et elle me renvoi un flux d'informations sans fin.

root@g-bill:~# dsp-load 
load: 0, freq: 0
load: 0, freq: 0
load: 0, freq: 0
load: 0, freq: 0
load: 0, freq: 0
load: 0, freq: 0
load: 0, freq: 0
load: 0, freq: 0
load: 0, freq: 0
load: 0, freq: 0

Je fais ctrl+c pour stoper la commande. Pour rediriger j'ai essayé : dsp-load > fichier.txt mais mon fichier.txt est vide.

Comment dois-je faire?

Merci d'avance.
Laurent :)

  • # te renseigner sur les flux dans un shell

    Posté par . Évalué à 1.

    il y a 3 types de flux par defaut
    STDIN pour les flux entrant,
    STDOUT pour les sorties,
    STDERR pour les sorties de messages d'erreurs.

    ton programme dsp-load envoie des infos, mais ce sont peut-etre des messages "d'erreur"
    ils sont donc envoyé sur STDERR et c'est 2> qui fait la redirection

    STDIN c'est fichier_sortant.txt
    STDERR c'est 2>fichier_sortant_erreur.txt

    • [^] # Re: te renseigner sur les flux dans un shell

      Posté par . Évalué à 1.

      Merci de ta réponse NeoX, j'ai essayé aussi avec 2> , 1> , 2>&1 et rien ne marche. Est-ce que cela peut venir du fait qu'il faut pas que la commande se termine pour écrire dans le fichier.txt ?

      Merci :)

      • [^] # Re: te renseigner sur les flux dans un shell

        Posté par . Évalué à 2.

        reste à aller lire le manuel de dsp-load

        moi j'ai parlé des flux standard, mais rien n'empeche un programme de sortir ces infos sur un autre flux (bien que cela m'etonne de le voir dans la console)

  • # changer la redirection ?

    Posté par . Évalué à 1.

    Je ne connais pas la commande dsp-load, mais la redirection de vers le fichier fonctionnerait peut être mieux en utilisant >> (ajouter à la fin du fichier) a la place de > (créer un fichier).

    • [^] # Re: changer la redirection ?

      Posté par . Évalué à 1.

      J'ai aussi essayé >> mais cela ne marche pas non plus. Pourtant il me semble que tout ce qui passe dans la console peut-être récupéré.

  • # stdbuf

    Posté par . Évalué à 2.

    Probablement un problème de bufferisation de stdout

    Pour voir, essaie
    stdbuf -o 0 dsp-load > fichier.txt

  • # Récupérer flux de données

    Posté par . Évalué à 2.

    j'ai essayé : dsp-load > fichier.txt mais mon fichier.txt est vide

    Certains programmes détectent si leur sortie est redirigée, et se comportent différemment dans ce cas. Par exemple, curl par défaut sort le résultat de la requête sur stdout, et n'affiche rien sur stderr; par contre si tu rediriges stdout vers un fichier, alors curl affiche sa progression sur stderr.

    Ne connaissant pas ton dsp-load, peut-être passe-t-il en mode silencieux lorsque sa sortie est redirigée.

    Que fait ceci:

    dsp-load |cat
    
    

    Hop,
    Moi.

    • [^] # Re: Récupérer flux de données

      Posté par . Évalué à 0.

      Merci de ta réponse ymorin. dsp-load | cat ne fait rien malheureusement :'( cela ne me retourne rien.

      • [^] # Re: Récupérer flux de données

        Posté par . Évalué à 3.

        si dsp-load | cat ne renvoie rien c'est que le | intercepte bien ce qui sort de dsp-load

        du coup tu dois pouvoir faire un

        dsp-load | tee -a fichier.log

        • [^] # Re: Récupérer flux de données

          Posté par . Évalué à 1.

          Cela marche pas non plus avec dsp-load | tee -a fichier.log.
          C'est bon j'ai une solution, je lance la commande script avec de lancer ma commande dsp-load.

          Voilivilou. Merciii

  • # buffer

    Posté par . Évalué à 0.

    Erreur de ma part, cela marche avec dsp-laod > "fichier.txt" En fait fallait attendre environ 3 min, le temps que le buffer se remplisse, et qu'il se vide dans fichier.txt.
    Mais comment vider le buffer plutôt pour ne pas attendre si longtemps?

    • [^] # Re: buffer

      Posté par (page perso) . Évalué à 1. Dernière modification le 13/12/11 à 11:06.

      Pour cela il faut modifier le programme "dsp-load" afin de desactiver le buffering de sortie,
      via par exemple pour du C:

      if ( !isatty(stdout) )
            setbuf(stdout, NULL);
      
      

      Edit: il manque la coloration C/C++...

Suivre le flux des commentaires

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