Forum Programmation.ruby Redirection dans un fichier

Posté par .
Tags : aucun
2
2
oct.
2008
Bonjour,

je coince depuis plusieurs heures sur un truc génant que je ne comprends pas. J'ai un programme ruby que j'ai fait qui copie des gros fichiers et qui écrit sur la sortie standard son avancement. Ca écrit que la copie du premier fichier est en cours, puis pareil pour le second fichier etc.
En ligne de commande ça marche impec. Par contre si je lance ça avec une redirection pour que l'affichage se fasse dans un fichier log alors le fichier log reste vide jusqu'à la fin de mon programme. Une fois que mon programme se termine alors le fichier log contient tout ce qu'il faut.

J'ai essayé de faire sync mais ça ne change rien. J'ai mis une pause entre chaque copie et le fichier log se rempli lors de chaque pause.

D'après vous ça vient de ruby ou du shell ou du noyau ? Et vous avez une idée pour résoudre ce problème ?
  • # fais voir ;)

    Posté par . Évalué à 3.

    salut,

    fais voir la ligne que tu tapes pour lancer ton appli en redirigeant vers le fichier.
    • [^] # Re: fais voir ;)

      Posté par . Évalué à 2.

      J'utilise tout simplement :
      sauvegarde.rb >> /var/log/sauvegarde 2>&1
  • # Mise en mémoire tampon de la sortie standard

    Posté par (page perso) . Évalué à 5.

    Je n'y connais rien en ruby, mais peut-être qu'un STDOUT.flush pourrait aider.
    • [^] # Re: Mise en mémoire tampon de la sortie standard

      Posté par (page perso) . Évalué à 3.

      Bonne réponse niol.
      La syntaxe est: $stdout.flush
      Cette instruction est à mettre à chaque fois que tu veux être certain que l'affichage soit bon.
      Ou même: $stdout.sync = true
      Ce qui permet de ne plus mettre de flush partout.

      note: je n'ai pas testé avec une redirection.
  • # Bufferisation

    Posté par . Évalué à -1.

    Je pense que ruby regarde si la sortie est un tty; si ce n'est pas le cas, il bufferise les sorties, ce qui est quand même nettement plus efficace.

    Il doit y avoir un moyen de le désactiver.
    (En perl c'est "$|=1;", je sais, cette information ne te sert à rien.)

Suivre le flux des commentaires

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