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)