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

Modules Perl Discussion :

probl�me avec File::Tee


Sujet :

Modules Perl

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    35
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France, Territoire de Belfort (Franche Comt�)

    Informations forums :
    Inscription : Avril 2006
    Messages : 35
    Par d�faut probl�me avec File::Tee
    Bonsoir � tous,

    Pour un de mes projets ,j' essaye de r�aliser les actions suivantes :

    - si un script est lanc� via une console, alors les sorties d'erreur et standard sont redirig�es � la fois � l'�cran et dans un fichier de log

    - si le script est lanc� via la crontab ou un autre ordonnanceur, les sorties sont uniquement redigir�es dans une log

    Pour cela j'utilise le code suivant :
    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
     
    use File::Tee qw(tee);
    use IO::Interactive qw(is_interactive);
     
    my $FILE="/home/olwin/Desktop/test";
     
     if ( is_interactive() ) {
    	##    ici le but est d'avoir les info a l'écran + ds un fichier de log    
    	tee STDOUT, { lock => 1, mode => '>>', open => "$FILE" };
      	tee STDERR, { lock => 1, mode => '>>', open => "$FILE" };
     
     }else{
     
      ## traitement lancé en crontab ou via un ordonnanceur quelconque
      open(STDOUT, ">$FILE") or die "erreur lors de l'ouverture de la sortie standard";
      open(STDERR, ">&STDOUT") or die "erreur lors de l'ouverture de la sortie d'erreur ";
      select (STDERR);
      # Suppression de la bufferisation de STDERR.
      $| = 1;
     select (STDOUT);
     # Suppression de la bufferisation de STDOUT.
     $| = 1;
    }
    Le soucis , en faisant un test en affichant les messages suivants:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    print STDOUT " OUT 1";
    print STDERR " ERR 1";
    print STDOUT " OUT 2";
    print STDERR " ERR 2";
    via crontab : j'obtient bien la bonne s�quence soit :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    OUT 1 ERR 1 OUT 2 ERR 2
    mais lorsque je le lance via un terminal , la s�quence est incorrect , j'obtient ceci :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    ERR 1 ERR 2 OUT 1 OUT 2
    Auriez vous une id�e du pourquoi ?

    J'ai essay� de supprimer la bufferisation sur les 2 sorties avant d'utiliser le module File::Tee, mais cela ne fonctionne pas.
    (bizarrement si je rajoute des \n dans chaque print, cela a l'air de fonctionner)

  2. #2
    Expert confirm�
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, C�te d'Or (Bourgogne)

    Informations professionnelles :
    Activit� : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par d�faut
    Citation Envoy� par olwin Voir le message
    Auriez vous une id�e du pourquoi ?
    STDOUT est mis en tampon alors que STDERR n'a pas de tampon.

    Citation Envoy� par olwin Voir le message
    J'ai essay� de supprimer la bufferisation sur les 2 sorties avant d'utiliser le module File::Tee, mais cela ne fonctionne pas.
    (bizarrement si je rajoute des \n dans chaque print, cela a l'air de fonctionner)
    Normalement si tu as bien mis l'autoflush sur les deux sorties �a devrait marcher, comment as-tu essay� de le faire ?

    --
    Jeda�

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    35
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France, Territoire de Belfort (Franche Comt�)

    Informations forums :
    Inscription : Avril 2006
    Messages : 35
    Par d�faut
    Citation Envoy� par Jedai Voir le message
    Normalement si tu as bien mis l'autoflush sur les deux sorties �a devrait marcher, comment as-tu essay� de le faire ?

    --
    Jeda�

    Apparemment le module File::Tee g�re l'autoflush par d�faut, j'ai essay� les deux m�thodes suivantes :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
     if ( is_interactive() ) {
     
    tee STDOUT, { lock => 1, mode => '>>', open => "$FILE", autoflush => 1 };
    tee STDERR, { lock => 1, mode => '>>', open => "$FILE", autoflush => 1 };
     
    }
    et celle-ci :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
     if ( is_interactive() ) {
     
    select (STDERR);
    $| = 1;
    select (STDOUT);
    $| = 1;
     
    ##    ici le but est d'avoir les info a l'écran + ds un fichier de log    
    tee STDOUT, { lock => 1, mode => '>>', open => "$FILE" };
    tee STDERR, { lock => 1, mode => '>>', open => "$FILE" };
     
    }
    Malheureusement aucune des deux n'a fonctionn�

  4. #4
    Expert confirm�
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, C�te d'Or (Bourgogne)

    Informations professionnelles :
    Activit� : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par d�faut
    Citation Envoy� par olwin Voir le message
    Malheureusement aucune des deux n'a fonctionn�
    Tu as essay� de combiner les deux ? La deuxi�me marche chez moi sans File::Tee (marche pas sous Windows et tout de suite je suis sous Windows, je testerais sous Linux quand j'y retournerai si tu n'as pas r�gl� ton probl�me entre-temps).

    --
    Jeda�

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    35
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France, Territoire de Belfort (Franche Comt�)

    Informations forums :
    Inscription : Avril 2006
    Messages : 35
    Par d�faut
    Citation Envoy� par Jedai Voir le message
    Tu as essay� de combiner les deux ? La deuxi�me marche chez moi sans File::Tee (marche pas sous Windows et tout de suite je suis sous Windows, je testerais sous Linux quand j'y retournerai si tu n'as pas r�gl� ton probl�me entre-temps).

    Jeda�
    Oui, cela ne fonctionne pas. (apparemment si le param�tre autoflush n'est pas renseign�, par d�faut il est activ�)

    J'ai regard� un peu le code du module, mais j'avoue que c'est bien au dessus de mes connaissances perl actuel

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    35
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France, Territoire de Belfort (Franche Comt�)

    Informations forums :
    Inscription : Avril 2006
    Messages : 35
    Par d�faut
    Bonjour,

    apr�s plusieurs �chec en voulant utiliser File::Tee, j'ai trouv� un module qui fonctionne partiellement :

    Le module est le suivant : Local::TeeOutput
    http://jenda.krynicky.cz/#Local::TeeOutput

    Utilisation :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
        my $FILE="/tmp/test.txt";
        open (LOG, ">>$FILE");
        openTee (*STDOUT, *STDOUT, *LOG);
        openTee (*STDERR, *STDERR, *LOG);
    Le seul gros soucis pour le moment,c'est que celui ci :
    redirige bien les erreurs cr�e dans le script (via la commande print qu'il "surcharge")

    Mais du coup :
    - les erreurs ou les messages affich�s sur SDTOUT des commandes syst�me ne sont affich�es que sur l'�cran et ne sont pas �crites dans la log

    Mais au moins je n'ai plus de probl�me de bufferisation , qui rendait les logs vraiment ilisible
    Je me rapproche d'une solution viable

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    35
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France, Territoire de Belfort (Franche Comt�)

    Informations forums :
    Inscription : Avril 2006
    Messages : 35
    Par d�faut
    et bien j'ai enfin trouv� une solution !

    Parfois la meilleure solution est la plus simple --> pass� par une commande syst�me

    pour rediriger � la fois dans un fichier de log et sur l'�cran, il suffit d'�crire ceci :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
           my $FILE="/tmp/test";
             select (STDERR);
    	# Suppression de la bufferisation de STDERR.
    	$| = 1;
    	select (STDOUT);
    	# Suppression de la bufferisation de STDOUT.
    	$| = 1;
     
    	open TEE, "| tee ${FILE}";
    	open STDOUT, ">&TEE";
    	open STDERR, ">&TEE";
    et bien sur ne pas oublier � la fin du programme :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    close (STDERR);
    close (STDOUT);
    close (TEE);

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Probl�me avec FILE
    Par lisco dans le forum C++
    R�ponses: 1
    Dernier message: 23/12/2009, 17h11
  2. probl�me avec files dans assembly
    Par felix79 dans le forum Maven
    R�ponses: 4
    Dernier message: 15/09/2009, 11h39
  3. Probl�me avec File.Exists
    Par kazylax dans le forum VB.NET
    R�ponses: 2
    Dernier message: 16/06/2009, 15h40
  4. Bitmap et probl�me avec file move
    Par PatStan17 dans le forum ASP.NET
    R�ponses: 7
    Dernier message: 02/06/2009, 08h20
  5. [VS2008 Express] Probl�me avec File.SetLastWriteTime
    Par bubulemaster dans le forum D�buter
    R�ponses: 3
    Dernier message: 06/07/2008, 12h56

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